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

时间:2018-07-18 09:10:32

标签: python python-3.x queue python-multiprocessing pool

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())

1 个答案:

答案 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