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 ...
随机推荐
- RT-thread内核之异常与中断
一.什么是中断? 中断有两种,一种是CPU本身在执行程序的过程中产生的,一种是由CPU外部产生的. cpu外部中断,就是通常所讲的“中断”(interrupt).对于执行程序来说,这种“中断”的发生完 ...
- HttpServletRequestWrapper 是HttpServletRequest的包装类 ·关系相当于 int 与integer的关系
HttpServletRequestWrapper 是HttpServletRequest的包装类 ·关系相当于 int 与integer的关系
- Python 嵌套函数和闭包
Python 嵌套函数和闭包 1.函数嵌套 如果在一个函数内部定义了另一个函数,我们称外部的函数为外函数,内部的函数为内函数,如下代码: def out_func(): def inner_func1 ...
- vdbench-自动化测试脚本
#!/usr/bin/python # -*- coding:utf8 -*- import sys import commands TEST_CONF=""" hd=d ...
- Luogu1053 NOIP2005篝火晚会
首先造出所要求的得到的环.如果将位置一一对应上,答案就是不在所要求位置的人数.因为显然这是个下界,并且脑补一下能构造出方案达到这个下界. 剩下的问题是找到一种对应方案使错位数最少.可以暴力旋转这个环, ...
- css边框以及其他常用样式
1. 边框是1像素,实体的,红色的. <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- CentOS 文件及目录等
1.在linux中一切皆是文件,只是类型不同,通过ls -l看到的一个字母表示文件的类型 -:普通文件. d:目录文件. l:链接文件. b:块设备文件. c:字符设备文件. p:管道文件. 2.文件 ...
- 周记【距gdoi:133天】
蔡大神坚持每天写日记记录他所剩的oi生涯. 可是我呢?自从搞完数据结构后都不知道在干什么,整天在傻叉.也许是给自己压力太大了,或许是真的自己在迷茫以及犹豫,更或者自己真的是想太多不想写题,觉得烦了,没 ...
- [SDOI2014][BZOJ3533] 向量集 [线段树+凸包]
题面 BZOJ传送门 思路 首先当然是推式子 对于一个询问点$(x_0,y_0$和给定向量$(x_1,y_1)$来说,点积这么表达: $A=x_0x_1+y_0y_1$ 首先肯定是考虑大小关系:$x_ ...
- hdu5652:India and China Origins(并查集)
倒序操作用并查集判断是否连通,新技能get√(其实以前就会了 这题细节很多...搞得整个程序都是调试输出,几度看不下去想要重写 并查集到现在大概掌握了两个基本用途:判断是否连通 / 路径压缩(上一篇b ...