繁体   English   中英

多处理模块中的池和管理器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM