代码之家  ›  专栏  ›  技术社区  ›  Panos Kalatzantonakis

满足条件时终止所有进程

  •  3
  • Panos Kalatzantonakis  · 技术社区  · 7 年前

    我正在使用Starmap运行测试功能。
    当进程首先找到排列[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)])
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Jean-François Fabre    7 年前

    我对这一切不是很熟悉 multiprocessing 但是设置全局变量只适用于线程。 多处理 创建不同的进程,因此全局变量将重复,并且值的更改仅在 现在的 过程。

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

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

    找到组合后,只需在列表中附加一些内容。在所有进程中测试列表是否为空。我已经修改了您的示例,使其按原样工作(不需要 numpy 在这里, random.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个进程已经停止。