python - 为什么信号处理程序中的打印操作可能会改变死锁情况?

标签 python linux signals deadlock

我得到了如下简单的程序:

import threading
import time
import signal

WITH_DEADLOCK = 0

lock = threading.Lock()

def interruptHandler(signo, frame):
    print str(frame), 'received', signo
    lock.acquire()
    try:
        time.sleep(3)
    finally:
        if WITH_DEADLOCK:
            print str(frame), 'release'
        lock.release()

signal.signal(signal.SIGINT, interruptHandler)
for x in xrange(60):
    print time.strftime("%H:%M:%S"), 'main thread is working'
    time.sleep(1)

因此,如果您启动该程序,甚至在 3 秒内按两次 Ctrl+C,则不会出现死锁。每次按下 Ctrl + C 时,都会显示正确的行。 如果您更改 WITH_DEADLOCK=1 并按下 Ctrl+C 两次(3 秒内),那么程序将挂起。

有没有人可以解释为什么打印操作会产生如此大的差异?

(我的python版本是2.6.5)

最佳答案

老实说,我认为 J.F. Sebastian 的评论是这里最合适的答案 - 您需要让您的信号处理程序可重入,目前它不是,而且它在没有打印语句的情况下仍然可以工作,这主要是令人惊讶。

关于python - 为什么信号处理程序中的打印操作可能会改变死锁情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10777610/

相关文章:

python - 将 pandas 数据框元素转换为元组

linux - 匹配一个模式,插入模式,直到下一次匹配

Linux命令将一个文件复制到多个文件

mysql 使用 signal/resignal 进行错误处理

c - 程序在收到信号时终止 - 信号 SIG34,实时事件 34

signals - 如何在 Elm 中创建一组满足给定条件的三元组?

Python Pandas dataframe : For each month of the year, 如果月份不存在,则将月份最后一天的日期添加到索引中,或者删除重复项

python - 带有可变数据的 RegEx - ply.lex

带有额外字符的python 3打印

python - 如何从简单的 CGI python 服务器运行 shell 脚本?