什么会导致python注册的信号被忽略?

2024-10-02 16:21:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,其中有多个threading启动的线程,其中几个线程偶尔会冻结(显然是同时冻结)。在这个脚本中,我注册了一个信号处理程序来转储所有运行线程的堆栈跟踪。当它冻结时,不会出现倾倒的堆积物。是什么原因造成的?你知道吗

我想到了几个可能性:

  • 线程没有释放mutex,冻结任何其他试图获取它的线程。不过,在这种情况下,我希望信号处理程序能正常工作。我弄错了吗?你知道吗
  • 我将各种内容记录到stdoutstderrr,它们通过bash命令行重定向到日志文件。也许来自两个线程的精确定时输出可能会在操作系统级别阻塞?这个脚本已经运行了几个月没有问题,尽管最近有一个内核更新(它是ubuntu12.04)。如果是这样,信号不会被忽略,只是不会产生任何输出。。。你知道吗
  • 我有几个全局变量是由冻结线程读写的。我原以为Python2.7有一个全局线程锁来保证安全,而这在以前不是问题。你知道吗

Tags: 程序脚本内容堆栈stdout记录情况原因
1条回答
网友
1楼 · 发布于 2024-10-02 16:21:38

Python的signal模块专门在主解释器线程上运行信号处理程序。如果主线程挂起并且无法执行Python代码,则信号处理程序将不会运行。信号将被激发和捕获,但是如果线程不能执行Python代码,那么什么也不会发生。你知道吗

避免这种情况的最佳方法是确保主线程(启动时存在于Python解释器中的第一个线程)不会死锁。这可能意味着要确保初始化后该线程上不会发生任何重要的事情。你知道吗

相关问题 更多 >