3

Python のシグナルハンドラーは再入可能ですか?

1秒間に何度もスタックのスナップショットを作成するタイマーのシグナルハンドラーがあります-統計プロファイラーです。時間がかかりすぎる場合、シグナルハンドラーは再入力できますか? もしそうなら、どうすればそれを守ることができますか?

私のコード:

import signal, time, traceback, threading

def start(interval=0.1):
    global _interval, _samples
    _samples = []
    signal.signal(signal.SIGALRM,_sample)
    signal.setitimer(signal.ITIMER_REAL,interval,interval)

def stop():
    global _samples
    signal.setitimer(signal.ITIMER_REAL,0,0)
    samples, _samples = _samples, []
    samples.append((time.time(),None,None,[]))
    return samples

def _sample(signo,frame):
    thread = threading.current_thread()
    row = (time.time(),thread.ident,thread.name,traceback.extract_stack(frame))
    if not _samples or row[1:] != _samples[-1][1:]: # new stack since last sample?
        _samples.append(row)
4

1 に答える 1

0

一般に、Python でシグナルをブロックする方法はありません。ただし、SIGALRM とフレンドはスタックできないため、一度に送信されるのは 1 つだけです。ハンドラー関数の最後で次のタイマー イベントをスケジュールするだけであれば、再入可能性について心配する必要はありません。

于 2012-11-08T10:01:17.847 に答える