day-4 python多进程编程知识点汇总
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
day-4 python多进程编程知识点汇总的更多相关文章
- day-3 python多线程编程知识点汇总
python语言以容易入门,适合应用开发,编程简洁,第三方库多等等诸多优点,并吸引广大编程爱好者.但是也存在一个被熟知的性能瓶颈:python解释器引入GIL锁以后,多CPU场景下,也不再是并行方式运 ...
- Python多进程编程
转自:Python多进程编程 阅读目录 1. Process 2. Lock 3. Semaphore 4. Event 5. Queue 6. Pipe 7. Pool 序. multiproces ...
- 【转】Python多进程编程
[转]Python多进程编程 序. multiprocessingpython中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Pytho ...
- Python 多进程编程之 进程间的通信(在Pool中Queue)
Python 多进程编程之 进程间的通信(在Pool中Queue) 1,在进程池中进程间的通信,原理与普通进程之间一样,只是引用的方法不同,python对进程池通信有专用的方法 在Manager()中 ...
- Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法----这是操作系统开辟 ...
- 深入理解python多进程编程
1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所 ...
- Python 简明教程 --- 26,Python 多进程编程
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 学编程最有效的方法是动手敲代码. 目录 1,什么是多进程 我们所写的Python 代码就是一个程序, ...
- python并发编程知识点总结
1.到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程. 2.Python多线程情况下: 计算密集型操作:效率低,Python内置的一个全局解释器锁,锁 ...
- python多进程编程(二)
进程同步(锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进 ...
随机推荐
- [BZOJ3275] Number (网络流)
Description 有N个正整数,需要从中选出一些数,使这些数的和最大. 若两个数a,b同时满足以下条件,则a,b不能同时被选 1:存在正整数C,使a*a+b*b=c*c 2:gcd(a,b)=1 ...
- UWP:使用Composition实现类似安卓的水波纹Ripple效果
先放效果图: 首先,建立一个RippleHelper.cs文件,然后建立以下附加属性: IsFillEnable:是否扩大到整个控件 RippleDuration:持续时间 RippleRadius: ...
- 19.JavaScript
简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型 1.注释 单行 // 多行 /* */ 2.引用方式 <head> <meta c ...
- 依赖反转原则DIP 与 asp.net core 项目结构
DIP 依赖反转原则 Dependency Inversion Principle 的定义如下: 高级别的模块不应该依赖于低级别的模块, 他们都应该依赖于抽象. 假设Controller依赖于Repo ...
- devstack部署openstack环境
背景:公司需要搭建openstack私有云.配置两台物理服务器. 各大搜索引擎了解了下OpenStack.决定先在虚拟机上部署实现openstack. 前提准备 设备:一台宿主机Windows10 1 ...
- CentOS7.4安装MySQL踩坑记录
CentOS7.4安装MySQL踩坑记录 time: 2018.3.19 CentOS7.4安装MySQL时网上的文档虽然多但是不靠谱的也多, 可能因为版本与时间的问题, 所以记录下自己踩坑的过程, ...
- Hybrid App混合模式开发的了解
Hybrid App(混合模式移动应用)是指介于web-app.native-app这两者之间的app,兼具"Native App良好用户交互体验的优势"和"Web Ap ...
- 创建Android项目及常见错误解决
首先打开eclipse,点击右上角有一个这个小按钮,点击java然后OK 因为切换到这个视图来创建android程序更加方便,然后点击 Next Next 这个地方可以修改android应用程序的图标 ...
- iOS 提交审核报错 ERROR ITMS-90087解决办法
ERROR ITMS-: "Unsupported Architectures. The executable for yht.temp_caseinsensitive_rename.app ...
- 20165230 2017-2018-2 《Java程序设计》第3周学习总结
20165230 2017-2018-2 <Java程序设计>第3周学习总结 教材学习内容总结 本周主要学习了类与对象. 包括创建对象与构造方法. 了解了程序是由若干个类所构成:类分为类名 ...