【问题标题】:等待所有进程完成python
【发布时间】:2022-01-23 13:57:20
【问题描述】:

这个问题已经被问过很多次了,但我找不到与我的具体设置相匹配的答案。

我有一个使用多处理的脚本。这是一个非常简化的示例:

from multiprocessing import Pool

def my_function(arg1,arg2):
     print(arg1,arg2)

with Pool(processes=5) as pool:
     pool.starmap(function, [(arg1,arg2),(arg1,arg2)])
     pool.join()

print("should only run once all processes are finished")

我希望此时关闭池并继续正常的单一处理功能。我认为上下文管理器将处理池的关闭,并且 .join() 将确保它仅在所有进程完成后才关闭。但我看到的行为表明程序在所有进程完成之前运行超出了上下文管理器。我现在还需要做些什么吗?

此外,在这种情况下,分配了 5 个进程,但只有 2 个 args 元组传递给函数。在这种情况下,剩余的 3 个进程做了什么?

Python -V 3.9

【问题讨论】:

    标签: python-3.x multiprocessing


    【解决方案1】:

    您需要在pool.join() 之前调用pool.close()。 您可以通过调用当前进程的_identity 变量来查看哪个进程运行该函数。最后,您可以通过调用当前进程的name 来确保只有主进程在运行。 由于调用次数少于进程数,因此其余进程只是在执行通常的操作系统操作。

    
    from multiprocessing import Pool, current_process
    def my_function(arg1,arg2):
        rank = f'running on process: {current_process()._identity[0]}'
        print(rank, arg1,arg2)
    
    
    arg1 = 'arg1'
    arg2 = 'arg2'
    with Pool(processes=5) as pool:
        pool.starmap(my_function, [(arg1,arg2),(arg1,arg2)])
        pool.close()
        pool.join()
    
    print(current_process().name)
    print("should only run once all processes are finished")
    

    输出:

    running on process: 1 arg1 arg2
    running on process: 2 arg1 arg2
    MainProcess
    should only run once all processes are finished
    

    【讨论】:

      猜你喜欢
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      相关资源
      最近更新 更多