Python信号处理程序和重新进入

时间:2012-11-08 08:49:53

标签: python signals reentrancy

Python中的signal handlers是否可以重入?

我有一个定时器的信号处理程序,可以每秒多次快照堆栈 - 它是一个统计分析器。如果花费太长时间,我的信号处理程序可以重新进入吗?如果是这样,我该怎样保护呢?

My code

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)

1 个答案:

答案 0 :(得分:0)

一般情况下,无法阻止python中的信号。但是,SIGALRM和朋友无法堆叠,因此一次只能发送一个。如果您只是在处理函数结束时安排下一个计时器事件,则不必担心重入。