Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python信号处理程序和重入_Python_Signals_Reentrancy - Fatal编程技术网

Python信号处理程序和重入

Python信号处理程序和重入,python,signals,reentrancy,Python,Signals,Reentrancy,在Python中是可重入的吗 我有一个计时器的信号处理程序,它每秒对堆栈进行多次快照,这是一个统计分析器。如果需要的时间太长,我的信号处理器是否可以重新进入?如果是的话,我该如何保护它 : 一般来说,在python中无法阻止信号。但是,SIGALRM和friends不能堆叠,因此一次只能发送一个。如果您只是在处理程序函数的末尾安排下一个计时器事件,您就不必担心可重入性。设置布尔值或调用函数禁用报警是否存在竞争?您的意思是设置dump_stack变量?不太可能,因为它只能从信号处理程序内部设置。S

在Python中是可重入的吗

我有一个计时器的信号处理程序,它每秒对堆栈进行多次快照,这是一个统计分析器。如果需要的时间太长,我的信号处理器是否可以重新进入?如果是的话,我该如何保护它

:


一般来说,在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)