终止池中的所有进程

terminate all processes in a Pool

我有一个 python 脚本,如下所示:

import os
import tempfile
from multiprocessing import Pool

def runReport(a, b, c):
    # do task.
    temp_dir = tempfile.gettempdir()
    if (os.path.isfile(temp_dir + "/stop_check")):
        # How to terminate all processes in the pool here?

def runReports(args):
    return runReport(*args)

def main(argv):
    pool = Pool(4)
    args = []
    # Code to generate args. args is an array of tuples of form (a, b, c)
    pool.map(runReports, args)

if (__name__ == '__main__'):
main(sys.argv[1:])

还有另一个 python 脚本创建了这个文件 /tmp/stop_check。 创建此文件后,我需要终止池。我怎样才能做到这一点?

只有 parent 进程可以终止池。你最好让 parent 运行 一个循环来检查该文件是否存在,而不是试图让每个 child 执行它然后向 parent 发出信号不知何故:

import os
import sys
import time
import tempfile
from multiprocessing import Pool

def runReport(*args):
    # do task

def runReports(args):
    return runReport(*args)

def main(argv):
    pool = Pool(4)
    args = []
    # Code to generate args. args is an array of tuples of form (a, b, c)
    result = pool.map_async(runReports, args)
    temp_dir = tempfile.gettempdir()
    while not result.ready():
        if os.path.isfile(temp_dir + "/stop_check"):
            pool.terminate()
            break
        result.wait(.5) # Wait a bit to avoid pegging the CPU. You can tune this value as you see fit.

if (__name__ == '__main__'):
    main(sys.argv[1:])

通过使用 map_async 而不是 map,您可以自由地让 parent 使用循环来检查文件是否存在,然后在出现时终止池必要的。不要认为使用 terminate 杀死 children 意味着他们根本无法进行任何清理,因此您需要确保他们中的 none 访问可以访问的资源如果进程在使用它们时终止,则会处于不一致状态。