运行系统为Linux

进程池中使用队列共享数据

进程池中使用队列共享数据需要使用Manager()内的Queue()方法。
multiprocessing内部的Queue是针对父子进程间使用,而使用进程池,进程池内的进程并不一定会满足父子关系。

queue.Queue()队列

通常用于线程之间,可线程之间共享。

multiprocessing.Queue()队列

通常用于进程之间,可父子进程间数据共享。
线程之间也可用此方法进行线程之间数据共享。

multiprocessing.Manager().Queue()队列

通常用于进程池的进程之间以及进程池与主进程之间,可进程池数据共享。
不可用于非进程池或线程之间。

进程池中使用队列共享数据代码实现demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import multiprocessing
import time


def consumer(queue):
while queue.qsize() != 0:
try:
print(queue.get(block=False))
time.sleep(1)
except:
time.sleep(1)
print("QueueSize: ", queue.qsize())


def productor(queue):
for i in range(10):
queue.put(i)


queue = multiprocessing.Manager().Queue() # 使用进程池需要使用Manager()内的Queue()
# queue = multiprocessing.Queue() # 如果使用multiprocessing下的Queue()函数不会执行

mul_pool = multiprocessing.Pool()
mul_pool.apply_async(productor, (queue, ))
for i in range(2):
print("start")
mul_pool.apply_async(consumer, (queue, ))
mul_pool.close()
mul_pool.join()