multiprocessing.pool 不会终止(Python 2.7)



我对multiprocessing.pool有问题。即使满足下面 while 循环中定义的退出条件,我的工人也永远不会退出。在最后一个工作线程完成其作业后,不再进入 while 循环。但是,子进程不会像我预期的那样终止,而只是空闲,主进程不会继续。这是在 Ubuntu 上。

最后一个输出是"完成",之后没有任何反应。如果我在下面添加我注释掉的行,即 handler.get()程序运行并正确终止,没有错误(仅使用一个进程(。也许这里有一个明显的错误,但我没有想法,任何帮助不胜感激!

manager = multiprocessing.Manager()
pool = multiprocessing.Pool()
queue = manager.Queue()
lock = manager.Lock()
finished = manager.list()
active = manager.list()
pending = manager.list()
for core in core_list:
     queue.put(core)
     pending.put(core.id)
while len(pending) > 0:
    print "Submit jobs"
    core = queue.get(block=True)
    handler = pool.apply_async(solve_core, (core, core_list, params))
    #handler.get()
pool.close()
pool.join()
def solve_core(core, core_list, params):
    lock.acquire()
    pending.remove(core.id)
    active.append(core.id)
    lock.release()
    # Process some data...
    lock.acquire()
    active.remove(core.id)
    finished.append(core.id)
    for new_core in core_list:
        if some_condition:
            queue.put(new_core)
            pending.append(new_core.id)
    lock.release()
    print "Done"

存在明显的争用条件错误,尽管还有更多错误。你的程序依赖于子进程来清空pending列表,但是当你使用apply_async时,子进程可能无法像主进程的while len(pending) > 0循环那样快地更改pending列表,然后主进程调用的次数将超过队列大小的queue.get(block=True)次数,结果,主进程在queue.get上阻塞。

相关内容

  • 没有找到相关文章

最新更新