Python多处理,池映射 - 取消所有正在运行的进程(如果有),返回所需的结果

Dan*_*yal 4 python dictionary pool multiprocessing

给出以下Python代码:

import multiprocessing

def unique(somelist):
    return len(set(somelist)) == len(somelist)


if __name__ == '__main__':
    somelist = [[1,2,3,4,5,6,7,8,9,10,11,12,13,2], [1,2,3,4,5], [1,2,3,4,5,6,7,8,9,1], [0,1,5,1]]

    pool = multiprocessing.Pool()
    reslist = pool.map(unique, somelist)
    pool.close()
    pool.join()
    print "Done!"

    print reslist
Run Code Online (Sandbox Code Playgroud)

现在想象一下,这个玩具示例中的整数列表非常长,我想在这里实现的是:如果某个列表中的某个列表返回True,则终止所有正在运行的进程.

这导致了两个问题(可能还有更多我没想过的问题):

  • 当其他进程正在运行时,如何从完成的进程中"读取"/"侦听"结果?如果一个进程正在处理来自某个列表的[1,2,3,4,5],并且在所有其他进程之前完成,那么如何在此刻读出该进程的结果?

  • 鉴于这是可能的,而其他正在运行的"读"出成品过程的结果的情况下:我该如何使用这一结果为条件,结束所有其他正在运行的进程?

例如,如果一个进程已完成并返回True,我如何使用它作为终止所有其他(仍在)正在运行的进程的条件?

提前感谢任何提示Dan

Tor*_*man 6

用于pool.imap_unordered按照它们出现的任何顺序查看结果.

reslist = pool.imap_unordered(unique, somelist)
pool.close()
for res in reslist:
    if res:  # or set other condition here
        pool.terminate()
        break
pool.join()
Run Code Online (Sandbox Code Playgroud)

您可以迭代imap主进程中的reslist,同时池进程仍在生成结果.