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 ...
随机推荐
- isset、is_null、empty的区别
版本:PHP 5.4 1.isset() :检测变量是否存在,测试如下: $a = false; $b = null; $c; $d = 0; $e = true; var_dump(isset($a ...
- docker使用记录
1.安装(开始前要注意系统内核版本是否合适,建议用7以上的系统吧,少点坑) //安装docker yum -y install docker-io //启动 service docker start ...
- 【以前的空间】BZOJ2733[HNOI2012]永无乡
启发式合并?! 似乎当时写并查集的时候就有看到过类似于把小并查集并到大并查集上的说法,原来这就是启发式…… 具体做法就是把小树里面的一个个拿出来,然后加到大树里面去(裸的不敢相信) const max ...
- BZOJ4815 [CQOI2017]小Q的表格 【数论 + 分块】
题目链接 BZOJ4815 题解 根据题中的式子,手玩一下发现和\(gcd\)很像 化一下式子: \[ \begin{aligned} bf(a,a + b) &= (a + b)f(a,b) ...
- Kindle 电子书相关的工具软件【转】
这里是与 Kindle 电子书相关的工具软件.它们可以帮助我们解决在日常使用电子书时所可能遇到的问题,比如 kindle 管理工具.kindle 转换工具.kindle电子书制作工具.kindle 推 ...
- JavaScript身份证号码有效性验证
最近需要对身份证合法性进行验证,实名验证是不指望了,不过原来的验证规则太过简单,只是简单的验证了身份证长度,现在业务需要加强下身份证验证规则,网上找到了不少资料,不过都不合偶的心意,无奈只好直接写一个 ...
- PhoneGap API介绍:File
本文将介绍PhoneGap API——File:通过JavaScript截获本地文件系统.File是用于读取.写入和浏览文件系统层次结构的PhoneGap API. 对象: DirectoryEntr ...
- Balanced Sequence(毒瘤啊)排序贪心 HDU多校
Problem Description Chiaki has n strings s1,s2,…,sn consisting of '(' and ')'. A string of this type ...
- bzoj 4724 [POI2017]Podzielno 二分+模拟
[POI2017]Podzielno Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 364 Solved: 160[Submit][Status][ ...
- Activity-ListView
在手机中经常有列表方式.如果Activity中只有唯一一个List(这也是通常的情况),可以继承ListActivity来实现.我们用两个例子来学习List. List例子一:利用Android自带的 ...