多处理 apply_async 多处理队列的奇怪行为
multiprocessing apply_async strange behaviour with multiprocessing queue
import time
import multiprocessing
def multi_thread(files):
q = multiprocessing.Queue()
for f in files:
q.put(f)
p = multiprocessing.Pool(5)
for i in range(5):
p.apply_async(worker_test, args=(q,))
p.close()
p.join()
def worker_test(i):
print 'hello'
print i
def main():
files = ['a', 'b', 'c', 'd']
multi_thread(files[0:4])
print 'Multi-thread time: {0} seconds'.format(time.time() - t0)
if __name__ == '__main__':
main()
如果我传入q
,我的代码甚至没有进入work_test()
函数来打印hello
。但如果我将 q
更改为 i
,代码运行正常。它以某种方式不喜欢 multiprocessing.Queue()
对象 - 知道发生了什么事吗?
您需要创建一个可以在不同进程之间共享的队列实例。您可以使用 multiprocessing.Manager object.
来做到这一点
以下代码似乎有效:
import time
import multiprocessing
def multi_thread(files):
m = multiprocessing.Manager()
q = m.Queue()
for f in files:
q.put(f)
p = multiprocessing.Pool(5)
for i in range(5):
p.apply_async(worker_test, args=(i, q))
p.close()
p.join()
def worker_test(i, q):
print 'hello'
print i
def main():
files = ['a', 'b', 'c', 'd']
multi_thread(files[0:4])
if __name__ == '__main__':
main()
import time
import multiprocessing
def multi_thread(files):
q = multiprocessing.Queue()
for f in files:
q.put(f)
p = multiprocessing.Pool(5)
for i in range(5):
p.apply_async(worker_test, args=(q,))
p.close()
p.join()
def worker_test(i):
print 'hello'
print i
def main():
files = ['a', 'b', 'c', 'd']
multi_thread(files[0:4])
print 'Multi-thread time: {0} seconds'.format(time.time() - t0)
if __name__ == '__main__':
main()
如果我传入q
,我的代码甚至没有进入work_test()
函数来打印hello
。但如果我将 q
更改为 i
,代码运行正常。它以某种方式不喜欢 multiprocessing.Queue()
对象 - 知道发生了什么事吗?
您需要创建一个可以在不同进程之间共享的队列实例。您可以使用 multiprocessing.Manager object.
来做到这一点以下代码似乎有效:
import time
import multiprocessing
def multi_thread(files):
m = multiprocessing.Manager()
q = m.Queue()
for f in files:
q.put(f)
p = multiprocessing.Pool(5)
for i in range(5):
p.apply_async(worker_test, args=(i, q))
p.close()
p.join()
def worker_test(i, q):
print 'hello'
print i
def main():
files = ['a', 'b', 'c', 'd']
multi_thread(files[0:4])
if __name__ == '__main__':
main()