博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
day-4 python多进程编程知识点汇总
阅读量:4329 次
发布时间:2019-06-06

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

 

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 multiprocessingimport 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"] = 1    manage_l.append("2")#循环从进程队列中写数据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"] = 2    manage_l.append("2")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))
View Code

  学习进程程通信:Condition

'''学习进程程通信:Condition1 --- Father:今天学习怎么样?2 --- Child:今天学习很好3 --- Father:知识都听懂了吗?4 --- Child:知识都听懂了5 --- Father:干的不错,继续保持6 --- Child:好的Mutiple proccess cost : 19'''import multiprocessingimport 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))
View Code

 

 

 参考链接:

 

转载于:https://www.cnblogs.com/python-frog/p/8673439.html

你可能感兴趣的文章
Sybase IQ导出文件的几种方式
查看>>
案例:手动输入一个字符串,打散放进一个列表,小写字母反序 大写字母保持不变...
查看>>
linux 系统下 tar 的压缩与解压缩命令
查看>>
阿里负载均衡,配置中间证书问题(在starcom申请免费DV ssl)
查看>>
转:How to force a wordbreaker to be used in Sharepoint Search
查看>>
MySQL存储过程定时任务
查看>>
Python中and(逻辑与)计算法则
查看>>
POJ 3267 The Cow Lexicon(动态规划)
查看>>
设计原理+设计模式
查看>>
音视频处理
查看>>
tomcat 7服务器跨域问题解决
查看>>
前台实现ajax 需注意的地方
查看>>
Jenkins安装配置
查看>>
个人工作总结05(第二阶段)
查看>>
Java clone() 浅拷贝 深拷贝
查看>>
深入理解Java虚拟机&运行时数据区
查看>>
02-环境搭建
查看>>
spring第二冲刺阶段第七天
查看>>
搜索框键盘抬起事件2
查看>>
阿里百川SDK初始化失败 错误码是203
查看>>