多处理 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()