ctrl + c无法停止线程和扭曲

时间:2014-06-10 02:33:41

标签: python multithreading twisted

我在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

2 个答案:

答案 0 :(得分:0)

我认为你的问题可能是你终止这个过程的有力性质。

使用扭曲时,您应致电reactor.stop()以获取最初的run来阻止阻止。

如果您更改signal_handler以关闭反应堆。

def signal_handler(*args):
    print("Killed by user")
    reactor.stop()

您的主题仍然可以使进程保持活动状态。 Thread.join并没有强行停止一个线程,这通常不是一个好主意。如果EventTriggerMemoryInfo仍在运行,thr.join将会阻止。您将需要一种机制来阻止线程。也许看看here

答案 1 :(得分:0)

sys.exit()引发了一个Python异常;我非常确定在信号处理程序中引发异常并没有太大作用。如Alex所说,调用reactor.stop()或使用os._exit(0)。请注意,使用os._exit(0)将终止该过程,而无需进一步操作。