我在main方法中安装了信号,
但是当我在运行过程中按ctrl + c时,进程没有停止,
exceptions.SystemExit: 0
^CKilled by user
Unhandled Error
EventTrigger 和 MemoryInfo 是从线程继承的类
和 HttpStreamClient 是来自twosted.reactor的类推理
如何通过ctrl + c终止我的进程,谢谢
def signal_handler(*args):
print("Killed by user")
# teardown()
sys.exit(0)
def install_signal():
for sig in (SIGABRT, SIGILL, SIGINT, SIGSEGV, SIGTERM):
signal(sig, signal_handler)
def main():
try:
global cgi, config
install_signal()
config = Config().read_file(sys.argv[1])[0]
init_export_folder()
setup_logging()
threads = [
EventTrigger(config),
MemoryInfo(config),
]
for thr in threads:
thr.setDaemon(True)
thr.start()
HttpStreamClient(config).run()
for thr in threads:
thr.join()
except BaseException as e:
traceback.print_exc(file=sys.stdout)
raise e
答案 0 :(得分:0)
我认为你的问题可能是你终止这个过程的有力性质。
使用扭曲时,您应致电reactor.stop()
以获取最初的run
来阻止阻止。
如果您更改signal_handler
以关闭反应堆。
def signal_handler(*args):
print("Killed by user")
reactor.stop()
您的主题仍然可以使进程保持活动状态。 Thread.join
并没有强行停止一个线程,这通常不是一个好主意。如果EventTrigger
或MemoryInfo
仍在运行,thr.join
将会阻止。您将需要一种机制来阻止线程。也许看看here。
答案 1 :(得分:0)
sys.exit()引发了一个Python异常;我非常确定在信号处理程序中引发异常并没有太大作用。如Alex所说,调用reactor.stop()或使用os._exit(0)。请注意,使用os._exit(0)将终止该过程,而无需进一步操作。