Python信号处理程序和重入
在Python中是可重入的吗 我有一个计时器的信号处理程序,它每秒对堆栈进行多次快照,这是一个统计分析器。如果需要的时间太长,我的信号处理器是否可以重新进入?如果是的话,我该如何保护它 :Python信号处理程序和重入,python,signals,reentrancy,Python,Signals,Reentrancy,在Python中是可重入的吗 我有一个计时器的信号处理程序,它每秒对堆栈进行多次快照,这是一个统计分析器。如果需要的时间太长,我的信号处理器是否可以重新进入?如果是的话,我该如何保护它 : 一般来说,在python中无法阻止信号。但是,SIGALRM和friends不能堆叠,因此一次只能发送一个。如果您只是在处理程序函数的末尾安排下一个计时器事件,您就不必担心可重入性。设置布尔值或调用函数禁用报警是否存在竞争?您的意思是设置dump_stack变量?不太可能,因为它只能从信号处理程序内部设置。S
一般来说,在python中无法阻止信号。但是,SIGALRM和friends不能堆叠,因此一次只能发送一个。如果您只是在处理程序函数的末尾安排下一个计时器事件,您就不必担心可重入性。设置布尔值或调用函数禁用报警是否存在竞争?您的意思是设置dump_stack变量?不太可能,因为它只能从信号处理程序内部设置。SIGALRM不能堆叠,并且是非重复的,因此报警处理程序不需要重新进入。此外,正因为如此,您不必做任何事情来禁用警报。您可以简单地在报警处理程序的末尾安排下一个报警。我的意思是在take_samples函数的末尾,而不是在报警处理程序的末尾。报警不能安排在亚秒的时间间隔,因此统计分析器没有任何用处。你的取样想法也不适用于统计分析。对不起,我误解了。在你的问题中,没有规定必须在半实时的基础上进行统计分析。这不一定是这种情况,例如,对于分析内存使用情况而言,情况并非如此。
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)