3

以下のような簡単なプログラムを取得しました。

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 秒以内に 2 回押しても、デッドロックは発生しません。Ctrl + C を押すたびに適切な行が表示されます。WITH_DEADLOCK=1 を変更して Ctrl+C を 2 回 (3 秒以内に) 押すと、プログラムがハングします。

印刷操作でこのような違いが生じる理由を説明できる人はいますか?

(私のpythonバージョンは2.6.5です)

4

1 に答える 1

1

正直なところ、ここでは JF Sebastian のコメントが最も適切な答えだと思います。シグナル ハンドラを再入可能にする必要がありますが、現在はそうではありません。また、print ステートメントがなくても機能することはほとんど驚くべきことです。

于 2012-05-29T23:39:50.620 に答える