多线程: 不适合cpu密集操作型的任务,适合io操作密集型的任务
Queue \ Pipe 只是实现进程间数据的传递
Manager 实现了进程间数据的共享,即多个进程可以修改同一份数据
1.进程间Queue传递数据
from multiprocessing import Process, Queue#声明为进程queue def f(qq): print("in child:",qq.qsize()) qq.put([42, None, 'hello'])#子进程修该队列 if __name__ == '__main__': q = Queue()#留意 q.put("test123")#父进程修改队列 p = Process(target=f, args=(q,))#在子线程初始化的时候就传入q队列 p.start() p.join() print("444",q.get()) print("444", q.get())
输出:
called from child process function f
module name: __mp_main__
parent process: 7904
process id: 6868
2.进程间Pipe传递数据
from multiprocessing import Process, Pipe def f(conn): conn.send([42, None, 'hello from child']) conn.send([42, None, 'hello from child2']) print("from parent:",conn.recv()) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe()#管道的两头(父子),一边一个 p = Process(target=f, args=(child_conn,)) p.start() print(parent_conn.recv())#子发父收 print(parent_conn.recv()) parent_conn.send("张洋可好")#父发子收 p.join() # [42, None, 'hello from child'] # [42, None, 'hello from child2'] # from parent: 张洋可好
Managers进程同时修改相同数据:
from multiprocessing import Process, Manager import os def f(d, l): d[os.getpid()] =os.getpid()#进程ID l.append(os.getpid()) print(l) if __name__ == '__main__': with Manager() as manager: d = manager.dict() #{} #生成一个字典,可在多个进程间共享和传递 l = manager.list(range(5))#生成一个列表,可在多个进程间共享和传递 p_list = [] for i in range(5): p = Process(target=f, args=(d, l)) p.start() p_list.append(p) for res in p_list: #等待结果 res.join() print(d) print(l)
# [0, 1, 2, 3, 4, 3576]
# [0, 1, 2, 3, 4, 3576, 9624]
# [0, 1, 2, 3, 4, 3576, 9624, 10212]
# [0, 1, 2, 3, 4, 3576, 9624, 10212, 9392]
# [0, 1, 2, 3, 4, 3576, 9624, 10212, 9392, 7904]
# {3576: 3576, 9624: 9624, 10212: 10212, 9392: 9392, 7904: 7904}
# [0, 1, 2, 3, 4, 3576, 9624, 10212, 9392, 7904]