1、 python多进程简介

  由于Python设计的限制(我说的是咱们常用的CPython)。最多只能用满1个CPU核心。Python提供了非常好用的多进程包multiprocessing,他提供了一套和多线程类似的接口,有start、run等方法,我们只需要定义一个函数,Python会替我们完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。

2、  注意事项

  a)在UNIX平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join()方法 (实际上等同于wait)。对于多线程来说,由于只有一个进程,所以不存在此必要性。

  b)multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源)。

  c)多进程应该避免共享资源。在多线程中,我们可以比较容易地共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。此时我们可以通过共享内存和Manager的方法来共享资源。但这样做提高了程序的复杂度,并因为同步的需要而降低了程序的效率。

3、 常用接口

  Event():进程的事件用于主线程控制其他进程的执行,事件主要提供了三个方法wait、clear、set

  Queue():进程的队列,提供get和put方法

  Process():创建一个新的进程

  Lock():进程锁

  Semaphore:一种带计数的进程同步机制,当调用release时,增加计算,当acquire时,减少计数,当计数为0时,自动阻塞,等待release被调用

  Pipe():创建进程双向管道

  Manager():一种较为高级的多进程通信方式,它能支持Python支持的的任何数据结构,不限制多进程是否源于同一个父进程

  Lock():进程锁

  Pool():可以提供指定数量的进程供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它。

  Condition():Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法。

  

4、  代码实例

  学习进程程通信:Queue,Pipe,Manage,Event

'''
学习进程程通信:Queue,Pipe,Manage,Event
''' import multiprocessing
import time #循环从进程队列中取数据
def Proceedataget(q,p,parent_event,child_event,manage_d,manage_l):
for i in range(10):
print(q.get()) for i in range(20,30):
p.send(i)
parent_event.set()
child_event.wait() for i in range(20,30):
print("B process:" + str(p.recv())) manage_d[""] = 1
manage_l.append("") #循环从进程队列中写数据
def Proceedataput(q,p,parent_event,child_event,manage_d,manage_l):
for i in range(10):
q.put(i) for i in range(40,50):
p.send(i) child_event.set()
parent_event.wait()
for i in range(20,30):
print("A process:" + str(p.recv())) manage_d[""] = 2
manage_l.append("") if __name__ == "__main__": start_time = time.time() #定义一个进程队列
q = multiprocessing.Queue()
#定义一个进程双向管道
parent_conn,child_conn = multiprocessing.Pipe()
#定义两个进程事件
parent_event = multiprocessing.Event()
child_event = multiprocessing.Event()
#定义两个Manager对象
manage = multiprocessing.Manager()
manage_d = manage.dict()
manage_l = manage.list() #定义两个进程
l = []
p1 = multiprocessing.Process(target = Proceedataget,args=(q,child_conn,parent_event,child_event,manage_d,manage_l))
p1.start()
l.append(p1)
p2 = multiprocessing.Process(target = Proceedataput,args=(q,parent_conn,parent_event,child_event,manage_d,manage_l))
p2.start()
l.append(p2) #等待进程执行完毕
for p_list in l:
p_list.join() end_time = time.time() print(manage_d)
print(manage_l) print("Mutiple proccess cost : %d"%(end_time - start_time))

  学习进程程通信:Condition

'''
学习进程程通信:Condition
1 --- Father:今天学习怎么样?
2 --- Child:今天学习很好
3 --- Father:知识都听懂了吗?
4 --- Child:知识都听懂了
5 --- Father:干的不错,继续保持
6 --- Child:好的
Mutiple proccess cost : 19
''' import multiprocessing
import time #父亲对话,父亲先说
def Conditionfather(cond):
time.sleep(10)
#父亲先说
cond.acquire()
print("1 --- Father:今天学习怎么样?")
time.sleep(2)
cond.notify() cond.wait()
print("3 --- Father:知识都听懂了吗?")
time.sleep(2)
cond.notify() cond.wait()
print("5 --- Father:干的不错,继续保持")
cond.notify()
time.sleep(2) #一定要加,否则父亲进程退出,无法知会儿子
cond.release() #孩子对话
def Conditionchild(cond):
#儿子等父亲说完
cond.acquire()
cond.wait()
print("2 --- Child:今天学习很好")
time.sleep(1)
cond.notify() cond.wait()
print("4 --- Child:知识都听懂了")
time.sleep(1)
cond.notify() cond.wait()
print("6 --- Child:好的")
cond.notify()
time.sleep(1) #保持程序严谨,也要加上
cond.release() if __name__ == "__main__": start_time = time.time() #定义一个condition对象
cond = multiprocessing.Condition() #定义两个进程
l = []
p1 = multiprocessing.Process(target = Conditionchild,args=(cond,))
p1.start()
l.append(p1)
p2 = multiprocessing.Process(target = Conditionfather,args=(cond,))
p2.start()
l.append(p2) #等待进程执行完毕
for p_list in l:
p_list.join() end_time = time.time() print("Mutiple proccess cost : %d"%(end_time - start_time))

 参考链接:https://docs.python.org/2/library/multiprocessing.html

最新文章

  1. 利用私有的API获得手机上所安装的所有应用信息(包括版本,名称,bundleID,类型)
  2. JS控制,返回上一页之后强行刷新一次
  3. 【转】【翻译】对响应式SVG的再思考
  4. 【转】Java反射 之 反射基础
  5. MVP的PV模式与SC模式
  6. 发送SMS短信(JSON) 转载
  7. Mac 下安装mitmproxy
  8. Mina、Netty、Twisted一起学(二):TCP消息边界问题及按行分割消息
  9. nginx的学习材料
  10. [Everyday Mathematic]20150213
  11. HDFS体系结构
  12. jquery 中 fn.apply(this, arguments)是什么函数?有什么作用?能举个例子吗
  13. javascript 简易文本编辑器
  14. spring boot 包jar运行
  15. sqlalchemy关于时间的数据类型
  16. JavaSE 异常抛光解析
  17. Docker阿里云镜像加速
  18. JavaScript基本内容
  19. trapping-rain-water-ii
  20. HDU - 5592 ZYB's Premutation (权值线段树)

热门文章

  1. 【CJOJ1644】【洛谷2758】编辑距离
  2. Poj2723:Get Luffy Out
  3. WEB前端中rem单位的应用(一)
  4. Filter的过滤链理解
  5. 在linux上安装dotnetcore
  6. MySQL多数据源笔记1-MySQL主从复制
  7. python web开发-flask调试模式
  8. Windows Live Writer介绍及相关问题解决
  9. Java集合详解及List源码分析
  10. 掌握这些知识,你的python水平能更上一层楼(续)