博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中multiprocessing模块
阅读量:5033 次
发布时间:2019-06-12

本文共 3255 字,大约阅读时间需要 10 分钟。

multiprocess模块那来干嘛的?

答:利用multiprocessing可以在主进程中创建子进程。Threading是多线程,multiprocessing是多进程。

#该模块和Threading模块使用方法基本类似。

  • 首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章。
  • multiprocessing最好写在if __name__ == '__main__'当中,如果不放在这里面,windows可能会出错。其余环境则不会出现这种情况。我第一个案例没有加,第二个案例加了。

案例:

1 #!usr/bin/env python 2 #encding:utf-8 3 #by i3ekr 4  5 import multiprocessing,time 6  7 def job(q,a):#将Queue当参数传入,且必须放在首位。 8     time.sleep(3) 9     print 'this is test...%s'%(a)10 11 12 start = time.time()13 q = multiprocessing.Queue()#定义一个Queue,这个Queue是必须的。14 p1 = multiprocessing.Process(target=job,args=(q,1))#创建一个线程,第一个q是Queue,第二个是参数的value。如果没有参数的话必须要(q,)逗号是必须要加的15 p2 = multiprocessing.Process(target=job,args=(q,2))16 p1.start()17 p2.start()18 p1.join()19 p2.join()20 end = time.time()21 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
1 #!usr/bin/env python 2 #encding:utf-8 3 #by i3ekr 4  5 import multiprocessing,time 6  7 def job(q,a): 8     time.sleep(3) 9     q.put(a)#得到a10 11 12 if __name__ == '__main__':13     start = time.time()14     q = multiprocessing.Queue()15     p1 = multiprocessing.Process(target=job,args=(q,1))16     p2 = multiprocessing.Process(target=job,args=(q,2))17     p1.start()18     p2.start()19     p1.join()20     p2.join()21     res1 = q.get()#得到job得返回值22     res2 = q.get()23     print res1,res224     end = time.time()25     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的方法。

整理得出以下代码:

1 #!usr/bin/env python 2 #encding:utf-8 3 #by i3ekr 4  5 import multiprocessing,time 6  7 def job(a): 8     return a*a 9 10 def multipro():11     po = multiprocessing.Pool()#该处默认启用得是所有的核数,可以通过Pool(multiprocessing=3)这样去设置。12     res=po.map(job,range(10))13     print res14 15 if __name__ == '__main__':16     multipro()

除了map还有apply_async、

使用方法:res = po.apply_async(job,(2,))

1 #!usr/bin/env python 2 #encding:utf-8 3 #by i3ekr 4  5 import multiprocessing,time 6  7 def job(a): 8     return a*a 9 10 def multipro():11     po = multiprocessing.Pool()12     res=po.apply_async(job,(2,))#如果是只有一个参数依旧是一个可迭代的对象,所以需要多加一个逗号。13     print res.get()#通过get得到返回值14 15 if __name__ == '__main__':16     multipro()

运行结果:

root@i3ekr:/home/i3ekr/Desktop# python 1.py

2

可以将apply_async用得更高级。做成一个迭代器。

1 #!usr/bin/env python 2 #encding:utf-8 3 #by i3ekr 4  5 import multiprocessing,time 6  7 def job(a): 8     return a 9 10 def multipro():11     po = multiprocessing.Pool()12     res=[po.apply_async(job,(i,)) for i in range(10)]13     print([res.get() for res in res])#迭代res返回res给res.get14 15 if __name__ == '__main__':16     multipro()

进程锁


跟Theading一样,会去抢内存。如果不了解得可以参考:

基础知识:

  • acquire()#上锁
  • release()#解锁 

 

转载于:https://www.cnblogs.com/nul1/p/8964843.html

你可能感兴趣的文章
Easy Mock
查看>>
看看 Delphi XE2 为 VCL 提供的 14 种样式
查看>>
Python内置函数(29)——help
查看>>
机器学习系列-tensorflow-01-急切执行API
查看>>
SqlServer 遍历修改字段长度
查看>>
Eclipse快捷键:同时显示两个一模一样的代码窗口
查看>>
《架构之美》阅读笔记05
查看>>
《大道至简》读后感——论沟通的重要性
查看>>
JDBC基础篇(MYSQL)——使用statement执行DQL语句(select)
查看>>
关于React中props与state的一知半解
查看>>
java中Hashtable和HashMap的区别(转)
查看>>
关闭数据库
查看>>
webStrom智能提示忽略首字母大小写问题
查看>>
层叠加的五条叠加法则(一)
查看>>
设计模式六大原则(5):迪米特法则
查看>>
对Feature的操作插入添加删除
查看>>
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>