python中multiprocessing模块
multiprocess模块那来干嘛的?
答:利用multiprocessing可以在主进程中创建子进程。Threading是多线程,multiprocessing是多进程。
#该模块和Threading模块使用方法基本类似。
- 首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章。
- multiprocessing最好写在if __name__ == '__main__'当中,如果不放在这里面,windows可能会出错。其余环境则不会出现这种情况。我第一个案例没有加,第二个案例加了。
案例:
#!usr/bin/env python
#encding:utf-8
#by i3ekr import multiprocessing,time def job(q,a):#将Queue当参数传入,且必须放在首位。
time.sleep(3)
print 'this is test...%s'%(a) start = time.time()
q = multiprocessing.Queue()#定义一个Queue,这个Queue是必须的。
p1 = multiprocessing.Process(target=job,args=(q,1))#创建一个线程,第一个q是Queue,第二个是参数的value。如果没有参数的话必须要(q,)逗号是必须要加的
p2 = multiprocessing.Process(target=job,args=(q,2))
p1.start()
p2.start()
p1.join()
p2.join()
end = time.time()
print("run time is %s"%(end-start))
输出结果:
root@i3ekr:/home/i3ekr/Desktop# python 1.py
this is test...1
this is test...2
run time is 3.0163371563
那么函数有返回值的时候怎么做?
使用队列.put()进行保存值。使用get得到返回值。如下案例所示:
需要注意得是:
- 有多少个返回值就要有多少个get。并不是一下子把所有得返回值全都一起输出之类得。如下代码20-21行,因为有两个线程,所以执行了两遍job函数,所以也有两个返回值。故也必须要有两个get去得到value
#!usr/bin/env python
#encding:utf-8
#by i3ekr import multiprocessing,time def job(q,a):
time.sleep(3)
q.put(a)#得到a if __name__ == '__main__':
start = time.time()
q = multiprocessing.Queue()
p1 = multiprocessing.Process(target=job,args=(q,1))
p2 = multiprocessing.Process(target=job,args=(q,2))
p1.start()
p2.start()
p1.join()
p2.join()
res1 = q.get()#得到job得返回值
res2 = q.get()
print res1,res2
end = time.time()
print("run time is %s"%(end-start))
输出结果:
root@i3ekr:/home/i3ekr/Desktop# python 1.py
1 2
run time is 3.01186394691
当然上面那个方法不是那么友好,在python里有线程池的概念。通过线程池可以更好的解决这个问题。
线程池是什么?
- 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务
线程池做法思路:
- 先建立一个方法(即函数)专门用来放池子。例如:def multipro():
- 建立线程池。例如:po = multiprocessing.Pool()
- 通过线程池去实现方法(就是调用需要实现的功能,job是要实现多进程得功能函数)例如:res=po.map(job,range(10))
- map是mulprocessing的方法。
整理得出以下代码:
#!usr/bin/env python
#encding:utf-8
#by i3ekr import multiprocessing,time def job(a):
return a*a def multipro():
po = multiprocessing.Pool()#该处默认启用得是所有的核数,可以通过Pool(multiprocessing=3)这样去设置。
res=po.map(job,range(10))
print res if __name__ == '__main__':
multipro()
除了map还有apply_async、
使用方法:res = po.apply_async(job,(2,))
#!usr/bin/env python
#encding:utf-8
#by i3ekr import multiprocessing,time def job(a):
return a*a def multipro():
po = multiprocessing.Pool()
res=po.apply_async(job,(2,))#如果是只有一个参数依旧是一个可迭代的对象,所以需要多加一个逗号。
print res.get()#通过get得到返回值 if __name__ == '__main__':
multipro()
运行结果:
root@i3ekr:/home/i3ekr/Desktop# python 1.py
2
可以将apply_async用得更高级。做成一个迭代器。
#!usr/bin/env python
#encding:utf-8
#by i3ekr import multiprocessing,time def job(a):
return a def multipro():
po = multiprocessing.Pool()
res=[po.apply_async(job,(i,)) for i in range(10)]
print([res.get() for res in res])#迭代res返回res给res.get if __name__ == '__main__':
multipro()
进程锁
跟Theading一样,会去抢内存。如果不了解得可以参考:http://www.cnblogs.com/xishaonian/p/7624736.html
基础知识:
- acquire()#上锁
- release()#解锁
python中multiprocessing模块的更多相关文章
- python中multiprocessing.pool函数介绍_正在拉磨_新浪博客
python中multiprocessing.pool函数介绍_正在拉磨_新浪博客 python中multiprocessing.pool函数介绍 (2010-06-10 03:46:5 ...
- python 历险记(五)— python 中的模块
目录 前言 基础 模块化程序设计 模块化有哪些好处? 什么是 python 中的模块? 引入模块有几种方式? 模块的查找顺序 模块中包含执行语句的情况 用 dir() 函数来窥探模块 python 的 ...
- Python中optionParser模块的使用方法[转]
本文以实例形式较为详尽的讲述了Python中optionParser模块的使用方法,对于深入学习Python有很好的借鉴价值.分享给大家供大家参考之用.具体分析如下: 一般来说,Python中有两个内 ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- 【转】关于python中re模块split方法的使用
注:最近在研究文本处理,需要用到正则切割文本,所以收索到了这篇文章,很有用,谢谢原作者. 原址:http://blog.sciencenet.cn/blog-314114-775285.html 关于 ...
- Python中的模块介绍和使用
在Python中有一个概念叫做模块(module),这个和C语言中的头文件以及Java中的包很类似,比如在Python中要调用sqrt函数,必须用import关键字引入math这个模块,下面就来了解一 ...
- python中导入模块的本质, 无法导入手写模块的解决办法
最近身边一些朋友发生在项目当中编写自己模块,导入的时候无法导入的问题. 下面我来分享一下关于python中导入模块的一些基本知识. 1 导入模块时寻找路径 在每一个运行的python程序当中,都维护了 ...
- Python中time模块详解
Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...
- Python中collections模块
目录 Python中collections模块 Counter defaultdict OrderedDict namedtuple deque ChainMap Python中collections ...
随机推荐
- AppDomain.CurrentDomain.AssemblyResolve
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 参 ...
- VS2010中的sln,suo分别是什么含义
我们通过双击.sln加载出我们的工程. Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件 ...
- 关于c中的一些新函数
localtime 和 localtime_s: localtime:localtime(const time_t * _Time) time_t t;struct tm *local;time(&a ...
- WPF实例,以getFiles()获取文件夹,treeview的应用
读取电脑硬盘根目录添加到TreeView控件 foreach (DriveInfo item in System.IO.DriveInfo.GetDrives()) { if(item.ToStrin ...
- windows 2008 iis7 上传大文件限制的真正解决办法
以前做了一个网站 ,当时本机测试时上传文件大小没有问题,上G也应该可以,可是放在服务器后只能上传小于30M以下文件,当时基本需要也基本在30M以下,就没有管,后在网上发现原来是window2008本身 ...
- OBJ文件
OBJ文件是Alias|Wavefront公司为它的一套基于工作站的3D建模和动画软件"Advanced Visualizer"开发的一种标准3D模型文件格式,很适合用于3D软件模 ...
- httpservlet在创建实例对象时候默认调用有参数的init方法 destroy()方法 service方法, 父类的init方法给子类实例一个config对象
- [洛谷P4174][NOI2006]最大获利
题目大意:同Petya and Graph,数据范围改成$n\leqslant5\times10^3,m\leqslant5\times10^4$ 题解:同上 卡点:无 C++ Code: #incl ...
- UOJ228:基础数据结构练习题——题解
http://uoj.ac/problem/228 参考:https://www.cnblogs.com/ljh2000-jump/p/6357583.html 考虑当整个区间的最大值开方==最小值开 ...
- 欢迎大家收听喜马拉雅,我的主播频道http://m.ximalaya.com/weizhubo/44966139
关注光荣之路软件技术培训账号,即时收取测试开发技术的免费公开课信息,各大公司测试及开发招聘信息.最新的技术咨询.线下测试 喜马拉雅微电台,每天早晨光荣之路创始人吴老,都会跟大家一起分享测试行业心得体会 ...