IPC:进程间的通信
两种实现方式
管道:pipe
队列:queue(其实就是pipe+lock)
注意:两者实际上都是内存空间,不要往里面放入大数据,只能放数据量较小的消息
IPC所解决的问题
1.当多个任务并发的去修改共享数据,就可能会造成数据错乱,我们通过加互斥锁使多个任务对共享数据的操作由并发变为“串行”,从而保证了共享数据的安全,而当出现需要修改多个共享数据的需求时,我们就得再次加锁处理
---->IPC帮我们解决了需要自己加锁的问题
2.进程间的内存空间是彼此隔离的,如何完成通信(数据交互),就需要寻求一种共享的东西,硬盘是共享的,但是读取硬盘的速度慢
---->IPC实现了一种内存空间上的共享(两个进程之间通过队列交流)
队列的使用
from multiprocessing import Queue q = Queue(3) # 设置队列存放大小 q.put('你好') q.put({'name':"bob",'age':26}) q.put([1,2,3]) print(q.get()) print(q.get()) print(q.get())
注意
1.队列内可以存放的是python任意类型的数据
2.队列是先进先出
3.当put的数量大于队列允许放入的数量时,就会发生阻塞(block=True),直到队列中有消息被取走
4.当队列中的内容被取空时,get操作也会发生阻塞(block=True),直到有新的数据放入队列中
队列的其它参数
q.put(obj=,block=,timeout=) q.get(block=,timeout=)
put()
obj:代表要放入队列的数据
block:默认为True,代表当放入的数据数量大于队列允许的数量时,就会发生阻塞;False,则直接抛出 queue.Full 异常
timeout:默认为-1,代表当发生阻塞时,会一直等待(等待队列中有数据被取走),如果阻塞时间大于自设置的时间,则抛出queue.Full 异常
get()
block:与put()的意思类似,默认值也为True
timeout:与put()的意思类似,默认值为-1