gpt4 book ai didi

python - 父进程死亡时如何终止Python `ProcessPoolExecutor`?

转载 作者:行者123 更新时间:2023-12-05 00:51:44 26 4
gpt4 key购买 nike

如果父进程因任何原因终止,有没有办法使 concurrent.futures.ProcessPoolExecutor 中的进程终止?

一些细节:我在处理大量数据的作业中使用 ProcessPoolExecutor。有时我需要使用 kill 命令终止父进程,但是当我这样做时,来自 ProcessPoolExecutor 的进程继续运行,我也必须手动杀死它们。我的主要工作循环如下所示:

with concurrent.futures.ProcessPoolExecutor(n_workers) as executor:
result_list = [executor.submit(_do_work, data) for data in data_list]
for id, future in enumerate(
concurrent.futures.as_completed(result_list)):
print(f'{id}: {future.result()}')

如果父进程死亡,我可以在此处添加什么或做不同的事情以使 executor 中的子进程终止吗?

最佳答案

您可以在每个进程中启动一个线程以在父进程死亡时终止:

def start_thread_to_terminate_when_parent_process_dies(ppid):
pid = os.getpid()

def f():
while True:
try:
os.kill(ppid, 0)
except OSError:
os.kill(pid, signal.SIGTERM)
time.sleep(1)

thread = threading.Thread(target=f, daemon=True)
thread.start()

用法:将initializerinitargs传递给ProcessPoolExecutor

with concurrent.futures.ProcessPoolExecutor(
n_workers,
initializer=start_thread_to_terminate_when_parent_process_dies, # +
initargs=(os.getpid(),), # +
) as executor:

即使父进程是 SIGKILL/kill -9 的,这仍然有效。

关于python - 父进程死亡时如何终止Python `ProcessPoolExecutor`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71300294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com