如何将队列引用传递给pool.map_async()管理的函数?

2024-06-17 13:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望一个长时间运行的进程通过队列(或类似的东西)返回它的进度,我将把这个队列反馈给进度条对话框。我还需要在过程完成时得到结果。这里的一个测试示例使用RuntimeError: Queue objects should only be shared between processes through inheritance失败。

import multiprocessing, time

def task(args):
    count = args[0]
    queue = args[1]
    for i in xrange(count):
        queue.put("%d mississippi" % i)
    return "Done"

def main():
    q = multiprocessing.Queue()
    pool = multiprocessing.Pool()
    result = pool.map_async(task, [(x, q) for x in range(10)])
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()

if __name__ == "__main__":
    main()

我已经能够使用单独的进程对象(其中我amalowed传递队列引用)来实现这一点,但是我没有一个池来管理我要启动的许多进程。有什么更好的模式建议吗?


Tags: infortasktime队列queue进程main
1条回答
网友
1楼 · 发布于 2024-06-17 13:16:11

以下代码似乎有效:

import multiprocessing, time

def task(args):
    count = args[0]
    queue = args[1]
    for i in xrange(count):
        queue.put("%d mississippi" % i)
    return "Done"


def main():
    manager = multiprocessing.Manager()
    q = manager.Queue()
    pool = multiprocessing.Pool()
    result = pool.map_async(task, [(x, q) for x in range(10)])
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()

if __name__ == "__main__":
    main()

请注意,队列是从manager.Queue()而不是multiprocessing.Queue()获取的。谢谢亚历克斯把我指向这个方向。

相关问题 更多 >