如何退出在多处理池中运行的starmap_async进程?

时间:2019-04-23 18:35:01

标签: python multiprocessing exit terminate starmap

我有很多数据(超过一百万),需要对其进行一些计算,才能从数百万中找到一定的价值。这很费时间。为了加快处理速度,我尝试使用CPU的所有内核。为此,我正在使用multiprocessing-pool,并使用starmap_async调用工作进程(我需要交出多个参数)。基本上,到目前为止,它的局限性在于我必须等到列表的所有值都已执行并且所有进程完成后才能继续。一旦其中一个星标找到正确的值,就有可能结束星图过程?

我已经尝试了几种不同的方法,例如从工作进程终止,将整个结构更改为for循环,但似乎starmap进程需要运行到最后,并且无法停止。唯一的方法似乎是分别提取每个列表值,然后将其输入到单独的流程中,这又会产生较大的开销,并显着降低流程速度。 有人有主意吗?

此处Terminate a Python multiprocessing program once a one of its workers meets a certain condition中描述的解决方案看起来相同,但事实并非如此。我已经尝试过了,但是没有用。区别似乎在于所描述的问题中没有一个参数是可迭代的。我已经玩过这个游戏了,但我无法让它在星图过程完全完成之前结束过程。在推荐的解决方案中,过程开始并独立运行,直到找到解决方案为止。在我的情况下,星图似乎在不检查终止条件的情况下继续提供进程。

import multiprocessing

def worker(x, arg1, arg2):
    some calculation with all arguments
    **#here I need a possibility to cancel all processes and return the current x value**

if __name__ == '__main__':
    arg1 = somthing
    arg2 = somthing_else
    value_list = (a,b,c,d,e,.......)
    pool = multiprocessing.Pool(cpu_count()) 
    p = pool.starmap_async(worker, [(value_list, arg1, arg2) for x in value_list])

    pool.close()
    pool.join()

    for y in p:
        if y = correct_value:
            print(correct_value)
            break

0 个答案:

没有答案