使用pool.join()无法杀死多处理创建的僵尸进程

时间:2018-01-17 01:56:14

标签: python-3.x parallel-processing multiprocessing

任务是对群集进行并行信息检索。 get_on_mc_retrievals在提供候选者(mc)的情况下检索一些信息,它从pairwise_distances调用支持多个CPU的sklearn。即便如此,资源仍然未被充分利用,然后我实现了这段代码。

我的实施

def dev_get_sentence_retrieval(sent_mcs, num_retrieval):

    func = partial(MentionToRetrieval.get_one_mc_retrievals, num_retrieval=num_retrieval)

    pool = mp.Pool(mp.cpu_count())
    pool.daemon = True
    jobs = [pool.map_async(func, sent_mcs[i]) for i in range(len(sent_mcs))]
    res = [j.get() for j in jobs]
    pool.close()
    pool.join()

    return res

问题

# test 1
for i in range(5):
    res = dev_get_sentence_retrieval(conll_mcs[i], 20)
    print(res)

# test 2
for i in range(5, 10):
    res = dev_get_sentence_retrieval(conll_mcs[i], 20)
    print(res)

Test1可以顺利执行,但是执行test2程序会永远挂起。一些SO帖子指出pool.join()是解决方案,它会杀死僵尸进程,但它似乎不适合我的情况。我错过了代码中的任何内容吗?如果有更好的方法可以并行处理conll_mcs,请随时提出任何建议。

注意:

# structure of `conll_mcs`

conll_mcs
|--- sentence_mcs
    |--- word_position_mcs
        |--- mc

0 个答案:

没有答案