multiprocessing.pool不终止(python 2.7)

时间:2018-01-12 16:45:36

标签: python python-2.7 multiprocessing python-multiprocessing terminate

我遇到了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"

1 个答案:

答案 0 :(得分:0)

尽管还有更多,但存在明显的竞争条件错误。 您的程序依赖子进程清空pending列表,但在使用apply_async时,子进程可能无法像主pending循环那样快速更改while len(pending) > 0列表,然后主进程将调用queue.get(block=True)多于队列大小的时间,因此,主进程在queue.get上被阻止。