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

如何在python中使用单独的线程进行异步信号处理,python,multithreading,Python,Multithreading,下面是我的测试代码。 当使用python2.7运行时,它显示程序在所有生成的线程完成之前不会收到任何信号。 使用python3.2时,只调用主线程的sigintHandler。 我对python如何处理线程和信号感到困惑,那么我如何生成一个线程并在该线程中进行信号处理呢?有可能吗 from __future__ import print_function from threading import Thread import signal, os, sys from time import sl

下面是我的测试代码。
当使用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)

您说过:在python3.2中,只调用主线程的sigintHandler

我认为这是对的。从这里开始:

Python信号处理程序始终在主Python线程中执行,即使信号是在另一个线程中接收到的。这意味着信号不能用作线程间通信的手段。您可以改用线程模块中的同步原语


此外,只允许主线程设置新的信号处理程序。

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


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

如果将
sleep(10)
替换为
for i In range(10):sleep(1)
,会有什么区别吗?刚刚尝试过,但没有区别@shx2My的目的不是进行线程间通信,而是异步处理信号。