Python:当收到另一个信号时信号处理程序会发生什么

问题描述 投票:0回答:1
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 signals
1个回答
0
投票

此行为是由文档的这一部分暗示的:

Python 信号处理程序不会在低级 (C) 信号处理程序内执行。相反,低级信号处理程序会设置一个标志,告诉虚拟机稍后执行相应的 Python 信号处理程序(例如在下一个字节码指令时)。

因此,当它执行第一个信号处理程序时,另一个信号进来。这会设置上述标志,因此当解释器完成第一个信号处理程序中的当前指令时,它会再次调用该处理程序。

当第二个调用返回时,它将恢复到第一个信号处理程序中的位置。

© www.soinside.com 2019 - 2024. All rights reserved.