import time
import signal
global_thing = []
class Foreman:
def __init__(self):
signal.signal(signal.SIGUSR1, self.handle_sigusr1)
def handle_sigusr1(self, sig, frame):
global_thing.append("x")
i_am_nr = len(global_thing)
for i in range(4):
print("I am taking my sweet time", i_am_nr, i)
time.sleep(1)
def run_forever(self):
# there is no actual code here, all the action happens in the signal handlers
time.sleep(3600)
Foreman().run_forever()
令我有点惊讶的是,当第一个信号仍在处理时发送第二个信号时,结果如下:
$ python example.py
I am taking my sweet time 1 0
I am taking my sweet time 1 1
I am taking my sweet time 1 2
I am taking my sweet time 2 0
I am taking my sweet time 2 1
I am taking my sweet time 2 2
I am taking my sweet time 2 3
I am taking my sweet time 1 3
换句话说,信号处理程序似乎依次被挂起。但是,我在 Python 文档 中找不到任何描述这一点的内容。为了依赖这种行为,我希望有某种文档来解释预期的行为是什么。
此外,类似地:如果两个信号(几乎)完全相同的时间到达会发生什么:CPython 解释器是否能够捕获它们并按照观察到的方式处理它们?或者是否存在一些较低级别的问题仍然可能出错(以及以何种方式?)
(我对Linux特别感兴趣)
此行为是由文档的这一部分暗示的:
Python 信号处理程序不会在低级 (C) 信号处理程序内执行。相反,低级信号处理程序会设置一个标志,告诉虚拟机稍后执行相应的 Python 信号处理程序(例如在下一个字节码指令时)。
因此,当它执行第一个信号处理程序时,另一个信号进来。这会设置上述标志,因此当解释器完成第一个信号处理程序中的当前指令时,它会再次调用该处理程序。
当第二个调用返回时,它将恢复到第一个信号处理程序中的位置。