Почему операция печати в обработчике сигнала может изменить ситуацию взаимоблокировки?

Я получил простую программу, как показано ниже:

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)

Итак, если вы запустите эту программу, и даже Ctrl + C будет нажата дважды в течение 3 секунд, нет взаимоблокировки. При каждом нажатии клавиши Ctrl + C отображается соответствующая строка. Если вы измените WITH_DEADLOCK = 1, и дважды нажмите Ctrl + C (с 3 секундами), тогда программа будет висела.

Может ли кто-нибудь объяснить, почему операция печати делает такую ​​разницу?

(Моя версия python 2.6.5)

Ответ 1

Честно говоря, я думаю, что комментарий JF Sebastian является наиболее подходящим ответом здесь - вам нужно сделать ретранслятор вашего сигнала обработчиком, которого в настоящее время нет, и в основном просто удивительно, что он работает в любом случае без инструкции печати. ​​