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

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()添加到测试方法中,您将看到差异。

尽管如此,最好将队列作为方法参数传递给池,以确保它是 "the same" 对象。

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