方式1 queue队列 先进先出
进程之间默认是没有关联的,进程间的通信就是解决这个问题
from multiprocessing import Queue, Process这是解决普通进程间的通信
from multiprocessing import Manager, Pool这是解决进程间的通信
queue是阻塞的
from multiprocessing import Queue, Process
import os
import time
def write(q):
for value in [1, 2, 3]:
print("put %d to queue"%value)
q.put(value)
time.sleep(1)
def read(q):
while True:
if not q.empty():
value = q.get()
print("get %d from queue" % value)
time.sleep(1)
else:
break
if __name__ == "__main__":
queue =Queue()
pw = Process(target= write, args=(queue,)) ##这里就是把queue当作一个参数穿了进去。这样两个进程就和同一个queue相关联
pr = Process(target=read, args=(queue,))
pw.start()
pw.join()
pr.start()
pr.join()
print("complete")
Result:
put 1 to queue
put 2 to queue
put 3 to queue
get 1 from queue
get 2 from queue
get 3 from queue
complete
进程池之间的通信
from multiprocessing import Manager, Pool
import os
import time
def write(q):
for value in [1, 2, 3]:
print("put %d to queue"%value)
q.put(value)
time.sleep(1)
def read(q):
#while True:
#if not q.empty():
#value = q.get()
# print("get %d from queue" % value)
# time.sleep(1)
#else:
#break
for value in range(q.qsize()):
print("get %d from queue" % q.get())
if __name__ == "__main__":
q = Manager().Queue() #使用Manager中的Queue来初始化
po = Pool()
po.apply(write,(q,))#使用阻塞时创建进程, 这样就不用在read中使用死循环了
po.apply(read,(q,))
po.close()
po.join()
print("complete")