【发布时间】:2019-05-05 01:18:34
【问题描述】:
我在摆弄multiprocessing 和signal。
我正在创建一个池,并让工人赶上SIGTERMs。
没有明显的原因,我观察到子进程随机收到SIGTERMs。
这是一个 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
如您所见,这看起来不可预测。
那么,这些SIGTERMs 来自哪里?
这是正常的吗?
我能保证工人会完成他们的工作吗?
最后,让子进程捕获SIGTERMs 是否可以?
【问题讨论】:
标签: python multiprocessing signals sigterm