多处理模块中的池和管理器
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
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