如何在Python中使用单独的线程进行异步信号处理

2024-02-08

下面是我的测试代码。
当使用 python2.7 运行时,它表明程序在所有生成的线程完成之前不会收到任何信号。
而在 python3.2 中,只有主线程的 sigintHandler 被调用。
我对 python 如何处理线程和信号感到困惑,那么如何生成线程并在该线程内进行信号处理呢?有可能吗?

from __future__ import print_function
from threading import Thread
import signal, os, sys
from time import sleep

def sigintHandler(signo, _):
    print("signal %d caught"%signo)

def fn():
    print("thread sleeping")
    sleep(10)
    print("thread awakes")

signal.signal(signal.SIGINT, sigintHandler)

ls = []
for i in range(5):
    t = Thread(target=fn)
    ls.append(t)
    t.start()

print("All threads up, pid=%d"%os.getpid())
for i in ls:
    i.join()

while True:
    sleep(20)

Python 不异步处理信号。当您在 python 中安装信号处理程序时,运行时会安装一个仅设置标志的 C 信号处理程序存根。解释器检查字节码指令之间的标志,然后调用 python 信号处理程序。这意味着信号处理程序只能在字节码操作之间运行。如果 python 主线程正在执行 C 代码,则在当前操作完成之前它将无法处理信号。有一些 SIGINT(即 control-C)的规定可以中止阻塞的 IO,但仅限于主线程。

也就是说,如果您想根据接收到的信号在线程中执行代码,方法是在主线程中接收信号,然后通过队列向工作线程发送消息。您必须确保主线程永远不会在不可中断的调用中阻塞。在 python 2.7 中, join 是不可中断的(正如您所发现的)。在Python的更高版本中是这样的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Python中使用单独的线程进行异步信号处理 的相关文章

随机推荐