之前在一篇文章中写过,有关于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语法:多进程相关推荐

  1. python 命令行运行 多进程_Python初学——多进程Multiprocessing

    1.1 什么是 Multiprocessing 多线程在同一时间只能处理一个任务. 可把任务平均分配给每个核,而每个核具有自己的运算空间. 1.2 添加进程 Process 与线程类似,如下所示,但是 ...

  2. python多进程_Python多任务处理(多进程篇)

    Python多任务处理(多进程篇) 项目地址: https://github.com/tushushu/flying-python​github.com 多进程处理CPU密集型任务 CPU密集型任务的 ...

  3. python socket通信 多进程_python实现多进程通信实例分析

    操作系统会为每一个创建的进程分配一个独立的地址空间,不同进程的地址空间是完全隔离的,因此如果不加其他的措施,他们完全感觉不到彼此的存在.那么进程之间怎么进行通信?他们之间的关联是怎样的?实现原理是什么 ...

  4. python如何实现多进程_Python实现多进程的四种方式

    方式一: os.fork() # -*- coding:utf-8 -*- """ pid=os.fork() 1.只用在Unix系统中有效,Windows系统中无效 2 ...

  5. python ** 运算符_Python语法基础(2)运算符

    Python语言支持以下类型的运算符: 算术运算符 比较(关系)运算符 赋值运算符 逻辑运算符 位运算符 成员运算符 身份运算符 算术运算符 # coding=utf-8#两个数字相加sumNumbe ...

  6. python多进程怎么样_Python执行多进程任务的方法

    Python的多进程可以借助from multiprocessing import Pool来实现. 简而言之分为这样几步: 导入包from multiprocessing import Pool 编 ...

  7. 关于python的多线程和多进程_Python的多线程和多进程

    (1)多线程的产生并不是因为发明了多核CPU甚至现在有多个CPU+多核的硬件,也不是因为多线程CPU运行效率比单线程高.单从CPU的运行效率上考虑,单任务进程及单线程效率是最高的,因为CPU没有任何进 ...

  8. Python使用multiprocessing实现多进程

    Python使用multiprocessing实现多进程 进程是操作系统进行资源分配和调度的一个基本单位. 一.进程及多任务介绍 程序:程序是一个静态的概念.在一台电脑上,我们安装了很多程序,这些程序 ...

  9. Python多线程threading和多进程multiprocessing的区别及代码实现

    1. 多线程threading import time from threading import Threaddef thread_read(data):while True:print('read ...

最新文章

  1. centos nfs端口固定
  2. JavaFX图表(七)之散点图
  3. Java8中list转map方法总结
  4. 默认参数和命名关键字参数(1)
  5. Java RMI之介绍
  6. 大数据人才成了“香饽饽”
  7. CentOS 迁移SVN以及可视化管理工具iF.SVNAdmin
  8. 又见猛犸象:基因剪刀重新定制生命
  9. Linux下的永中 Office 2004(转)
  10. 列表的join方法,类方法formkeys,删除,集合,深浅拷贝赋值,冒泡排序
  11. 一个屌丝程序员的青春(六四)
  12. 狄利克雷卷积学习记录
  13. 导致word文档损坏故障发生的原因是什么?
  14. 计算机在我们生活中有哪些应用,计算机在生活中的应用有哪些?
  15. Wins10系统忘记开机密码快速解锁方法(图文教程)
  16. mysql常用增删改脚本 DBA可重复执行.sql文件
  17. jQuery百叶窗轮播图插件
  18. 如何获取微信文章封面和标题
  19. 小米wifi设置外网访问文件
  20. Java 编程风格军规,看这一篇就够了

热门文章

  1. java 工厂模式的写法_Java23种设计模式之抽象工厂模式
  2. RNA-Seq Transcriptome Profiling Identifies CRISPLD2 as a Glucocorticoid Responsive Gene that Modulat
  3. 社会计算研究组研究方向
  4. postgresql
  5. windows10中git 的下载安装
  6. 12.多线程的实现方式、线程安全问题的产生与解决以及生产者与消费者问题
  7. Caffe 中关于 LetNet-5 网络的定义文件 lenet.prototxt 解析
  8. LeetCode 152. Maximum Product Subarray--动态规划--C++,Python解法
  9. LeetCode 509. Fibonacci Number--Python解法
  10. java 字符串xml,解析java中的xml字符串?