我有一个如下所示的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。 创建此文件后,我需要终止池。我怎样才能做到这一点?
答案 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
来杀死孩子,这意味着他们根本不会做任何清理工作,所以你需要确保他们都不会访问可能会处于不一致状态的资源。该过程在使用过程中死亡。