在Python线程中处理信号

9 投票
4 回答
21842 浏览
提问于 2025-04-16 09:30

我有一个用Python写的多线程应用程序,每当我通过Ctrl+C或者有时候用kill命令来中断它时,这个应用就会卡住。此时会显示一个线程的堆栈跟踪,但应用程序仍然在前台运行,我通常需要用Ctrl+Z把它放到后台,然后再尝试结束它。

在一个多线程的应用程序中,正确处理信号和键盘中断的方式是什么呢?

4 个回答

5

CPython 线程:中断 这篇文章讲的是在 Python 线程中信号会发生什么,以及解决你问题的不同方法。值得一读。

5

我解决这个问题的方法是做了一个模块,这个模块可以保存一个线程的列表。这个模块还有一个方法,可以结束列表中的每一个线程。当收到信号时,我让这个方法被调用。最后,我创建了一个线程的包装类,这个类会自动把新创建的线程实例添加到线程列表中。

16

如果你在启动每个线程之前设置 newthread.daemon = True,那么当主线程结束时,这些线程会自动被杀掉。虽然这并不是你具体问的问题,但根据你描述的情况,知道这一点可能会对你有帮助。

撰写回答