python进程间通信
⽬录
概述
python的进程间通信主要有以下⼏种⽅式:消息队列(Queue)、管道(Pipe)、共享内存(Value,Array)、代理(Manager),以上分为两个类型,
进程间交互对象:消息队列(Queue)、管道(Pipe)
进程间同步:共享内存(Value,Array)、代理(Manager)
消息队列
消息队列常⽤于单向交互,消息队列操作简单,⽤于单向交互最⽅便。
⽰例
from multiprocessing import Process, Queue
def f(q):
q.put([42,None,'hello'])
if __name__ =='__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
())# prints "[42, None, 'hello']"
p.join()
管道
这是最常⽤的⼀种操作⽅法,
from multiprocessing import Process, Pipe
def f(conn):
conn.send([42,None,'hello'])
conn.close()
if __name__ =='__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print(v())# prints "[42, None, 'hello']"
p.join()
共享内存
如上所述,在进⾏并发编程时,通常最好尽量避免使⽤共享状态。使⽤多个进程时尤其如此。
但是,如果你真的需要使⽤⼀些共享数据,那么 multiprocessing 提供了两种⽅法。
from multiprocessing import Process, Value, Array
def f(n, a):
n.value =3.1415927
for i in range(len(a)):
a[i]=-a[i]
if __name__ =='__main__':
num = Value('d',0.0)
arr = Array('i',range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
服务器进程
由 Manager() 返回的管理器对象控制⼀个服务器进程,该进程保存Python对象并允许其他进程使⽤代理操作它们。进程通信方式
Manager() 返回的管理器⽀持类型: list 、 dict 、 Namespace 、 Lock 、 RLock 、 Semaphore 、 BoundedSemaphore 、Condition 、 Event 、 Barrier 、 Queue 、 Value 和 Array 。例如
from multiprocessing import Process, Manager
def f(d, l):
d[1]='1'
d['2']=2
d[0.25]=None
if __name__ =='__main__':
with Manager()as manager:
d = manager.dict()
l = manager.list(range(10))
p = Process(target=f, args=(d, l))
p.start()
p.join()
print(d)
print(l)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论