gpt4 book ai didi

python - 在 sleep 调用之间捕获信号

转载 作者:太空狗 更新时间:2023-10-30 00:17:07 24 4
gpt4 key购买 nike

所以,假设我有这段代码:

import signal
from time import sleep

def signalHandler(sig, frame):
print "signalHandler"
while True:
sleep(1)
#print "Caught" # Uncomment this line, and you get multiple signals - commented, you don't.

signal.signal(signal.SIGINT, signalHandler)
while True:
sleep(1)

如注释中所示,如果未注释 print 语句,代码将正常工作,并且信号处理程序将像它应该的那样捕获任何后续的 CTRL-C 按下。但是,如果留下评论,将永远不会捕获另一个信号。

这是为什么?我的猜测是连续的 sleep 调用被混在一起,并且控制永远不会回到 python 来捕捉信号。它必须为打印语句做些什么。任何人都可以对此有任何见解吗?

最佳答案

这确实很奇怪!

我相信这是 Python 生成的字节码内部结构与之前 Python 2.7 中存在的异常现象之间的微妙交互。注意两点:

  • 无论是否使用 print 语句,您的代码都可以在 Python 3 中完美运行。
  • 如果您将信号处理程序中的 sleep 更改为“sleep(60)”,您会注意到,如果您在打印完成之前按下 Ctrl-C,它仍然可以正常工作! (这就是让我怀疑的原因)。

如果您阅读 Issue 12472 in the Python bug tracker ,您会看到 Python 在下一条指令(在本例中为您的打印)之前插入了对 Py_CheckSleep 的内部调用,这导致信号在 sleep 时被捕获被打断。没有打印,就不会进行额外检查。

根据问题,此问题已在 Python 3 及更高版本中修复,但在早期版本中未修复。

关于python - 在 sleep 调用之间捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com