多处理apply_async多处理队列的奇怪行为

时间:2015-02-05 07:09:08

标签: python multiprocessing ubuntu-14.04

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

如果我传入work_test(),我的代码甚至不会输入hello功能来打印q。但是,如果我将q更改为i,则代码运行正常。不知怎的,它不喜欢multiprocessing.Queue()对象 - 任何想法发生了什么?

1 个答案:

答案 0 :(得分:1)

您需要创建一个可以在不同进程之间共享的队列实例。您可以使用multiprocessing.Manager对象执行此操作。

以下代码似乎有效:

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