我确信这真的很容易,但我找不到关于它的问题。
我有一堆进程在池中运行;当按下ctrl+c
时,我希望程序干净地停止和退出,而不会为每个关闭的进程发送"None"垃圾邮件。
给定以下测试代码:
#! /usr/bin/env python3
import multiprocessing
import signal
def graceful_close(blah, blah2):
exit()
signal.signal(signal.SIGINT, graceful_close)
def wait():
while True:
pass
try:
pool = multiprocessing.Pool(20)
for i in range(1, 20):
pool.apply_async(wait)
while True:
pass
except KeyboardInterrupt:
exit()
如何防止输出:
[-2019-09-15 21:56:06 ~/git/locane $> ./test_mp_exit_spam.py
^CNone
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
[-2019-09-15 21:56:11 ~/git/locane $>
到底是什么原因造成的?
请使用sys.exit
而不是exit
。
exit是交互式 shell 的帮助程序 - sys.exit 旨在用于程序。
而且由于您已经在处理SIGNINT
,不确定为什么需要显式处理KeyboardInterrupt
import sys
import multiprocessing
import signal
def graceful_close(blah, blah2):
sys.exit()
signal.signal(signal.SIGINT, graceful_close)
def wait():
while True:
pass
pool = multiprocessing.Pool(20)
for i in range(1, 20):
pool.apply_async(wait)
while True:
pass