终止池中的所有进程
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 访问可以访问的资源如果进程在使用它们时终止,则会处于不一致状态。
我有一个 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 访问可以访问的资源如果进程在使用它们时终止,则会处于不一致状态。