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里有线程池的概念。通过线程池可以更好的解决这个问题。

线程池是什么?

  • 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务

线程池做法思路:

  1. 先建立一个方法(即函数)专门用来放池子。例如:def multipro():
  2. 建立线程池。例如:po = multiprocessing.Pool()
  3. 通过线程池去实现方法(就是调用需要实现的功能,job是要实现多进程得功能函数)例如:res=po.map(job,range(10))
  4. 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()#解锁

最新文章

  1. 我的第一篇博客----LCS学习笔记
  2. Html限制input输入框只能输入数字
  3. [LintCode] Reverse Words in a String 翻转字符串中的单词
  4. POJ 3067 Japan(经典树状数组)
  5. fastBinaryJSON
  6. zhuan: ubuntu 安装 apache2
  7. 计算机思维or人的思维
  8. Android 使用monkey自动测试
  9. PCI-X总线
  10. Build FFmpeg for iOS
  11. Spring框架下的定时任务quartz框架的使用
  12. Oracle实战笔记(第七天)之PL/SQL进阶
  13. 英语口语练习系列-C38-颜色-谈论日常活动
  14. mongodb配置问题
  15. 「NOI2016」优秀的拆分 解题报告
  16. Python 编程快速上手 第六章总结
  17. vue-router2.0
  18. 获取Android文件路径
  19. Python面试题之Python中type和object的关系
  20. springmvc4处理get和post请求中文乱码问题

热门文章

  1. Git 应用补丁报错 “sha1 information is lacking or useless”
  2. wpf拖拽
  3. 【题解】洛谷P4735最大异或和
  4. [BZOJ3380] [USACO2004 Open]Cave Cows 1 洞穴里的牛之一
  5. BZOJ5335:[TJOI2018]智力竞赛——题解
  6. BZOJ3631:[JLOI2014]松鼠的新家——题解
  7. nowcoder OI 周赛 最后的晚餐(dinner) 解题报告
  8. github clone 指定的tag
  9. The Usage of Pymongo
  10. ExtJs在页面上window再调用Window的事件处理