python多进程_python语法:多进程
之前在一篇文章中写过,有关于Python线程的问题:
是枝裕和:内:用python多线程同时处理大量文件zhuanlan.zhihu.com
当然我的写的文章都是面对于一些初学者和python代码实战运用方面,对原理不做过多的解释,但是在python语言中,请记住这句话
由于GIL(全局解释器)的存在,该机制限制每个python进程中有且只有一个线程同时运行,也就是说即使写了threading,也于事无补,cpu只是在多个thread之间来回跳而已,并没有并发执行这些thread。
所以以后要写并发机制,还得用多进程multiprocessing模块
举个易于观察的实例,我在linux环境下分别用多线程和进程爬取大量网站的数据:
很显然,python对于大量文件的处理,采用多进程才是正确的处理方式。
废话说完,我们来科普一下python多进程模块的基本用法
先看一段简单的代码:
我们定义一个数组L,里面有4个人的名字;一个函数function,函数function分别打印:变量name,变量的pid,休眠1s后打印函数执行完毕的时间
import time
from multiprocessing import Pool
import os
L=["小刘","小张","小李","小迪"]
def function(name):print(name,os.getpid(),function)time.sleep(1)print(time.ctime())return
OK,先使用简单的for循环运行一下:
for name in L:function(name)
显示结果如下:很显然函数的进程,内存地址都是一样的,运行时间也差了1s。即同一个函数传不同的参数每隔一秒运行一次,这不用多说了吧是。
现在我们不考虑进程间的通信,数据共享,锁问题等等,如何最简单有效对大量的csv文件实现多进程并发执行呢?我相信段代码能解决90%以上文件处理的问题
if __name__=="__main__":p=Pool(4)for i in L:p.apply_async(function,args=(i,))p.close()p.join()print("所有进程执行完毕")
解释一下:
if __name__=="__main__":
多进程在windows运行必须添加这段代码。
(通常情况下这段代码的意思为:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。)
p=Pool(4)for i in L:p.apply_async(function,args=(i,))
创建一个4个进程的进程池,并用apply_async (异步非阻塞)的方式执行函数
你既然想并发就不要用apply的方式,反正我没用过。
后面的参数(function=所要执行的函数,args=()所要执行的函数中的参数)
记得函数不用加(),以及参数后面最后的逗号
然后将进程池
p.close()
p.join()
p.join()的意思是等待所有结果执行完毕,会等待所有子进程执行完毕
注意:close必须在join前调用
自己看结果吧~
多进程的运用还是很广泛的,比如你要处理1000个CSV文件,你用遍历一个个的运行,cpu利用率5%,但是如果你开16个进程 p=Pool(16)(看内核个数),你就可以并发处理16个文件,效率提高了16倍...
比如吧
我想看看我的“/2014_test/”文件夹下的每个csv文件有多少行数据,采用多进程,很快就能出来了
import time
import os
import csv
from multiprocessing import Pool
path = "/2014_test/"
files = os.listdir(path)
def function(i):list=[]with open(path+str(i),encoding="utf-8") as f :reader=csv.reader(f)for row in reader:list.append(row)print(len(list))print(time.ctime())
if __name__=="__main__":p=Pool(4)for i in files:p.apply_async(function,args=(i,))p.close()p.join()
if __name__ == '__main__':for i in files:l=[]p=Process(target=analyze_url,args=("/opt/linux_work/avaurl/2016/2016_5/" + i, i, "/opt/linux_work/parse/text/2016/2016_5/", "/opt/linux_work/parse/unparse/",))l.append(p)for p in l:p.start ()
溜了溜了
python多进程_python语法:多进程相关推荐
- python 命令行运行 多进程_Python初学——多进程Multiprocessing
1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务. 可把任务平均分配给每个核,而每个核具有自己的运算空间. 1.2 添加进程 Process 与线程类似,如下所示,但是 ...
- python多进程_Python多任务处理(多进程篇)
Python多任务处理(多进程篇) 项目地址: https://github.com/tushushu/flying-pythongithub.com 多进程处理CPU密集型任务 CPU密集型任务的 ...
- python socket通信 多进程_python实现多进程通信实例分析
操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...
- python如何实现多进程_Python实现多进程的四种方式
方式一: os.fork() # -*- coding:utf-8 -*- """ pid=os.fork() 1.只用在Unix系统中有效,Windows系统中无效 2 ...
- python ** 运算符_Python语法基础(2)运算符
Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 算术运算符 # coding=utf-8#两个数字相加sumNumbe ...
- python多进程怎么样_Python执行多进程任务的方法
Python的多进程可以借助from multiprocessing import Pool来实现. 简而言之分为这样几步: 导入包from multiprocessing import Pool 编 ...
- 关于python的多线程和多进程_Python的多线程和多进程
(1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...
- Python使用multiprocessing实现多进程
Python使用multiprocessing实现多进程 进程是操作系统进行资源分配和调度的一个基本单位. 一.进程及多任务介绍 程序:程序是一个静态的概念.在一台电脑上,我们安装了很多程序,这些程序 ...
- Python多线程threading和多进程multiprocessing的区别及代码实现
1. 多线程threading import time from threading import Threaddef thread_read(data):while True:print('read ...
最新文章
- centos nfs端口固定
- JavaFX图表(七)之散点图
- Java8中list转map方法总结
- 默认参数和命名关键字参数(1)
- Java RMI之介绍
- 大数据人才成了“香饽饽”
- CentOS 迁移SVN以及可视化管理工具iF.SVNAdmin
- 又见猛犸象:基因剪刀重新定制生命
- Linux下的永中 Office 2004(转)
- 列表的join方法,类方法formkeys,删除,集合,深浅拷贝赋值,冒泡排序
- 一个屌丝程序员的青春(六四)
- 狄利克雷卷积学习记录
- 导致word文档损坏故障发生的原因是什么?
- 计算机在我们生活中有哪些应用,计算机在生活中的应用有哪些?
- Wins10系统忘记开机密码快速解锁方法(图文教程)
- mysql常用增删改脚本 DBA可重复执行.sql文件
- jQuery百叶窗轮播图插件
- 如何获取微信文章封面和标题
- 小米wifi设置外网访问文件
- Java 编程风格军规,看这一篇就够了
热门文章
- java 工厂模式的写法_Java23种设计模式之抽象工厂模式
- RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene that Modulat
- 社会计算研究组研究方向
- postgresql
- windows10中git 的下载安装
- 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题
- Caffe 中关于 LetNet-5 网络的定义文件 lenet.prototxt 解析
- LeetCode 152. Maximum Product Subarray--动态规划--C++,Python解法
- LeetCode 509. Fibonacci Number--Python解法
- java 字符串xml,解析java中的xml字符串?