gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:12:49 24 4
gpt4 key购买 nike

下面是我的测试代码。
当使用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信号处理程序 stub 。解释器检查字节码指令之间的标志,然后调用python信号处理程序。这意味着信号处理程序只能在字节码操作之间运行。如果主python线程正在执行C代码,则在当前操作完成之前它将无法处理信号。 SIGINT(即control-C)有一些规定可以中止阻塞的IO,但只能在主线程中中止。

就是说,如果要基于接收到的信号在线程中执行代码,执行该操作的方法是在主线程中接收信号,然后通过队列将消息发送给工作线程。您将必须确保您的主线程永远不会在不可中断的调用中阻塞。在python 2.7中,join不可互操作(如您所知)。在更高版本的python中是这样。

关于python - 如何在Python中使用单独的线程进行异步信号处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19699314/

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