Python 多进程队列的获取与放置

4

我正在尝试使用Python的多进程功能来填充一个队列,并将它们打印出来,但是遇到了问题。能否有人指出我做错了什么?

import multiprocessing

my_q = multiprocessing.Queue()
my_list  =[i for i in range(0,100)]

def enqueue(q):
    for data in my_list:
        q.put(data)

def get_it(q):
    while not q.empty():
        item = q.get()
        print(item)


p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
p2 = multiprocessing.Process(target=get_it, args=(my_q,))
p1.start()
p2.start()

p1.join()
p2.join()

这个程序执行时没有打印任何东西。

1个回答

2

如果在队列被填充之前执行 get_it,它将立即返回并打印无内容。

你需要确保在调用 get_it 之前队列已经被填充。

例如,在所有项目都被加入队列之前等待调用 enqueue

...

p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
p1.start()
p1.join()

p2 = multiprocessing.Process(target=get_it, args=(my_q,))
p2.start()
p2.join()

或者修改get_it的方式如下,以免过早结束:

...

def get_it(q):
    while True:
        item = q.get()
        if item is None:  # loop until sentinel value (None) appear.
            break
        print(item)


my_list.append(None)  # sentinel value to denote end of input value
p1 = multiprocessing.Process(target=enqueue, args=(my_q,))
p2 = multiprocessing.Process(target=get_it, args=(my_q,))
p1.start()
p2.start()
p1.join()
p2.join()

或者使用 multiprocess.pool.Pool.map 代替:
import multiprocessing.pool

def get_it(item):
    print(item)

pool = multiprocessing.pool.Pool()
pool.map(get_it, range(100))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接