如何使用 Ctrl C 终止子线程?

新手上路,请多包涵

我想在 Python 中使用 Ctrl + C 停止执行进程。但我在某处读到 KeyboardInterrupt 异常仅在主线程中引发。我还读到主线程在子线程执行时被阻塞。那么如何杀死子线程呢?

例如, Ctrl + C 对以下代码无效:

 def main():
    try:
        thread = threading.Thread(target=f)
        thread.start()  # thread is totally blocking (e.g. while True)
        thread.join()
    except KeyboardInterrupt:
        print "Ctrl+C pressed..."
        sys.exit(1)

def f():
    while True:
        pass  # do the actual work

原文由 Amit S 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

问题是您正在使用 thread1.join() ,这将导致您的程序等待该线程完成才能继续。

信号将始终被主进程捕获,因为它是接收信号的进程,它是具有线程的进程。

按照你展示的那样做,你基本上是在运行一个“正常”的应用程序,没有线程功能,因为你启动 1 个线程并等到它完成才能继续。

原文由 webbi 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果你想让主线程在加入时接收 CTRL + C 信号,可以通过将超时添加到 join() 调用来完成。

以下似乎有效(如果您希望 main 真正结束,请不要忘记添加 daemon=True ):

 thread1.start()
while True:
    thread1.join(600)
    if not thread1.isAlive():
        break

原文由 korc 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏