gpt4 book ai didi

python - 多处理子进程随机接收 SIGTERM

转载 作者:行者123 更新时间:2023-12-01 01:23:10 27 4
gpt4 key购买 nike

我正在摆弄多处理信号。我正在创建一个池,并让工作人员捕获 SIGTERM。没有明显的原因,我观察到子进程随机接收 SIGTERM 。这是一个 MWE:

import multiprocessing as mp
import signal
import os
import time

def start_process():
print("Starting process #{}".format(os.getpid()))

def sigterm_handler(signo, _frame):
print("Process #{} received a SIGTERM".format(os.getpid()))

def worker(i):
time.sleep(1)

signal.signal(signal.SIGTERM, sigterm_handler)
while True:
with mp.Pool(initializer=start_process) as pool:
pool.map(worker, range(10))
time.sleep(2)

输出:

Starting process #7735
Starting process #7736
Starting process #7737
Starting process #7738
Starting process #7739
Starting process #7740
Starting process #7741
Starting process #7742
Job done.
Starting process #7746
Starting process #7747
Starting process #7748
Starting process #7749
Starting process #7750
Starting process #7751
Starting process #7752
Starting process #7753
Process #7748 received a SIGTERM
Process #7746 received a SIGTERM
Job done.
Starting process #7757
Starting process #7758
Starting process #7759
Starting process #7760
Starting process #7761
Starting process #7762
Starting process #7763
Starting process #7764

如您所见,这看起来不可预测。

那么,这些 SIGTERM 来自哪里?这是正常的吗?我能保证 worker 完成他们的工作吗?最后,让子进程捕获 SIGTERM 可以吗?

最佳答案

这是正常现象,可能会在池执行时发生 __exit__离开上下文管理器时。由于 worker 们已经完成了他们的工作,所以没有什么可担心的。池本身会导致 SIGTERM对于没有可用退出代码的工作人员池检查它。这会在 Pool._terminate_pool 中触发-方法(Python 3.7.1):

    # Terminate workers which haven't already finished.
if pool and hasattr(pool[0], 'terminate'):
util.debug('terminating workers')
for p in pool:
if p.exitcode is None:
p.terminate()

池工作人员将在几行后加入:

    if pool and hasattr(pool[0], 'terminate'):
util.debug('joining pool workers')
for p in pool:
if p.is_alive():
# worker has not yet exited
util.debug('cleaning up worker %d' % p.pid)
p.join()

在您调用 pool.terminate() 的场景中当你的员工明确地仍在运行(例如您正在使用 pool.map_async 然后使用 pool.terminate() ),您的应用程序将死锁等待 p.join() (除非你让 sigterm_handler 最终调用 sys.exit())

如果没有必要,最好不要搞乱信号处理程序。

关于python - 多处理子进程随机接收 SIGTERM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53598962/

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