[英]Pool and Manager in multiprocessing module
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())
发生这种情况的原因是您正在通过全局变量共享队列。 因此,如果使用已创建的队列进行池初始化,则它共享相同的队列,否则不共享。 将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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.