我正在尝试使用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()
此程序无需打印任何内容即可执行。
答案 0 :(得分:1)
如果在填充队列之前执行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))