我有一个带有多个threading
的python脚本 - 启动的线程,其中有几个线程偶尔会冻结(显然是同时)。在这个脚本中,我已经注册了一个信号处理程序来从所有正在运行的线程中转储堆栈跟踪。当它被冻结时,不会出现倾倒的堆栈。可能导致这种情况的原因是什么?
浮现在脑海中的几种可能性:
mutex
,冻结任何其他尝试获取它的线程。但是,我希望信号处理程序能够在这种情况下工作。我错了吗?stdout
和stderrr
,它们使用bash命令行重定向到日志文件。也许两个线程的精确定时输出可能在操作系统级别阻塞?虽然最近有一个内核更新(它是Ubuntu 12.04),但这个脚本已经运行了好几个月没有问题。如果是这种情况,信号不会被忽略,只是没有产生任何输出...... 答案 0 :(得分:3)
Python的signal
模块专门在主解释器线程上运行信号处理程序。如果主线程挂起且无法执行Python代码,则信号处理程序将无法运行。信号将被触发并被捕获,但如果线程无法执行Python代码,则不会发生任何事情。
避免这种情况的最好方法是确保主线程(启动时Python解释器中存在的第一个线程)不会死锁。这可能意味着确保初始化后该线程上不会发生任何重要事项。