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 ...
随机推荐
- 普通用户如何启动WCF服务
做Winform项目时,部署到客户机上有两个应用程序,Host和Client,在Host上运行着WCF服务供Client调用.平时现在在测试的时候都没发现有问题,但是当安装到客户的正式环境时发现服务启 ...
- Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...
- Luogu2540 斗地主增强版(搜索+动态规划)
单纯的暴搜似乎还是很好写的,然而过不了.出完顺子之后答案是可以dp出来的,于是大力搜然后大力dp就好了. dp时强行讨论完了几乎所有拆牌情况,理性愉悦一发. #include<iostream& ...
- Chrome查看html样式基本操作-div
1. div 标签(白板,块级标签),想学会前端,只需要学会div+css就可以了. span 标签 (白板,行内标签) 2. Chrome审查元素的使用.右击浏览器--检查---可以看标签是块级还是 ...
- JavaScript中:表达式和语句的区别
JavaScript中:表达式和语句的区别 Javascript语言精粹:表达式是由运算符构成,并运算产生结果的语法结构.程序是由语句构成,语句则是由“:(分号)”分隔的句子或命令.如果在表达式后面加 ...
- POJ1228:Grandpa's Estate——题解
http://poj.org/problem?id=1228 题目大意:给一个凸包,问是否为稳定凸包. ———————————————————————— 稳定凸包的概念为:我任意添加一个点都不能使这个 ...
- POJ2987:Firing——题解
http://poj.org/problem?id=2987 题目大意: 炒掉一个人能够获得b收益(b可以<0),但是炒掉一个人必须得炒掉他的下属(然后继续递归). 求最大收益和此时最小裁员. ...
- BZOJ4570:[SCOI2016]妖怪——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4570 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成 ...
- 数据库sharding,横向扩展
学习资料如下: http://www.cnblogs.com/skyme/p/3459765.html http://my.oschina.net/anthonyyau/blog/307165 htt ...
- "HK"日常之冻结术
在那遥远的MSDN上,有那么一只被隐藏的函数,它掌管着Windows内核威力不容小觑~ 本教程仅作为学习研究,禁止其他用途! 富强.民主.文明.和谐, 自由.平等.公正.法治, 爱国.敬业.诚信.友善 ...