【问题标题】:Terminate all processes when condition is met满足条件时终止所有进程
【发布时间】:2018-10-31 20:03:47
【问题描述】:

我正在使用星图来运行测试功能。
当进程首先找到排列 [5,2,4,3,1] 时,终止所有进程的最佳/最安全方法是什么?

import multiprocessing as mp
import time

def testing(lts):
    # code ....
    start_time = time.time()
    for x in range(1,500000):
        gg = [1,2,3,4,5]
        random.shuffle(gg)
        ### if gg==[5,2,4,3,1] terminate all processes
    total_time = time.time() - start_time
    return total_time

if __name__ == '__main__':

    with mp.Pool(processes=4) as pool:
    ret = pool.starmap(testing, [(lst,) for x in range(4)])

【问题讨论】:

  • 使用可以设置/测试并退出循环的托管变量。
  • 我确实尝试设置一个全局变量并将其设置为 true,然后在我使用的函数内部 if _FINISH: break but no joy ...它不会停止

标签: python parallel-processing multiprocessing starmap


【解决方案1】:

我对@9​​87654321@ 的这些东西不是很熟悉,但是设置一个全局变量只适用于线程。 multiprocessing创建了不同的进程,所以全局变量会被复制,值的变化只在当前进程中可见。

改为使用Manager,它在进程之间创建共享对象(例如字典、列表)。

可能有更简单的方法,但我选择创建一个共享的Manager.list() 对象,该对象最初是空的。

找到组合后,只需将某些内容添加到列表中即可。在所有进程中测试列表是否为空。我已经修改了您的示例,使其按原样工作(这里不需要numpyrandom.shuffle 工作正常。

import multiprocessing as mp, random
import time

def testing(lst):
    # code ....

    start_time = time.time()
    for x in range(1,500000):
        gg = [1,2,3,4,5]
        random.shuffle(gg)

        if gg==[5,2,4,3,1]:
            print(gg)
            lst.append(1)  # reflected on all processes
        if lst:
            # list is no longer empty: stop
            print("stop")
            break

    total_time = time.time() - start_time
    return total_time

if __name__ == '__main__':
    manager = mp.Manager()
    lst = manager.list()

    with mp.Pool(processes=4) as pool:
       ret = pool.starmap(testing, [(lst,) for x in range(4)])

    print(ret)

执行的痕迹:

[5, 2, 4, 3, 1]
stop
stop
stop
stop
[0.031249523162841797, 0.015624523162841797, 0.015624523162841797, 0.015624523162841797]

正如我们所见,当找到“解决方案”时,这 4 个进程已经停止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多