我希望编写一个服务,启动多个无限工作进程,并在主进程接收到 Ctrl+C 信号时终止这些子进程。不过我不知道如何正确地处理这个信号。
以下是我测试使用的代码:
当我尝试使用Ctrl+C时,我期望正在运行
以下是我测试使用的代码:
import os
import multiprocessing as mp
def g():
print(os.getpid())
while True:
pass
def main():
with mp.Pool(1) as pool:
try:
s = pool.starmap(g, [[]] * 1)
except KeyboardInterrupt:
print('Done')
if __name__ == "__main__":
print(os.getpid())
main()
当我尝试使用Ctrl+C时,我期望正在运行
g
的进程只接收SIGTERM
并静默终止,但是我实际上收到了如下输出:Process ForkPoolWorker-1:
Done
Traceback (most recent call last):
File "/usr/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
self.run()
File "/usr/lib/python3.8/multiprocessing/process.py", line 108, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.8/multiprocessing/pool.py", line 125, in worker
result = (True, func(*args, **kwds))
File "/usr/lib/python3.8/multiprocessing/pool.py", line 51, in starmapstar
return list(itertools.starmap(args[0], args[1]))
File "test.py", line 8, in g
pass
KeyboardInterrupt
这显然意味着父进程和子进程都会从Ctrl+C中抛出KeyboardInterrupt
,这得到了使用kill -2
测试的进一步证实。为什么会发生这种情况,如何处理才能达到我想要的效果?