终止池中的所有进程

时间:2015-01-28 20:10:39

标签: python multiprocessing

我有一个如下所示的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。 创建此文件后,我需要终止池。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

只有父进程可以终止池。你最好让父母运行一个循环,检查是否存在该文件,而不是试图让每个孩子都这样做,然后以某种方式向父母发出信号:

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,您可以自由地让父母使用循环来检查文件是否存在,然后在必要时终止池。不要使用terminate来杀死孩子,这意味着他们根本不会做任何清理工作,所以你需要确保他们都不会访问可能会处于不一致状态的资源。该过程在使用过程中死亡。