from multiprocessing import Pool, Manager
def test(num):
queue.put(num)
queue = Manager().Queue()
pool = Pool(5)
for i in range(30):
pool.apply_async(test, (i, ))
pool.close()
pool.join()
print(queue.qsize())
上面的代码输出为30。但是,如果将第8行与第9行交换(请参见下面的代码),则输出将为0。那么有人知道为什么吗?谢谢!
from multiprocessing import Pool, Manager
def test(num):
queue.put(num)
pool = Pool(5)
queue = Manager().Queue()
for i in range(30):
pool.apply_async(test, (i, ))
pool.close()
pool.join()
print(queue.qsize())
答案 0 :(得分:1)
发生这种情况是由于您通过全局变量共享队列。因此,如果使用已创建的队列进行池初始化,则它共享相同的队列,否则不共享。将print globals()
添加到测试方法中,您将看到区别。
尽管如此,最好将队列作为方法参数传递给池,以确保它是“相同”的对象。
def test(num, q):
q.put(num)
def main():
pool = Pool(5)
q = Manager().Queue()
for i in range(30):
pool.apply_async(test, (i, q))
pool.close()
pool.join()
print(q.qsize())
if __name__ == '__main__':
main()
Output: 30