Python:防止信号传播到子线程

Python:防止信号传播到子线程,python,multithreading,signals,Python,Multithreading,Signals,如果在线程运行时按^C,线程是否会获得SIGINT? 如果这是真的,我可以对调用线程做些什么来阻止它将SIGINT传播到正在运行的线程 调用方线程中的信号处理程序将阻止它? 还是每个线程都需要信号处理器 如中所述,您应该使用属性守护进程: 守护进程:一个布尔值,指示此线程是否为守护进程 线程(真)与否(假)。必须在启动()之前设置此选项 调用,否则将引发RuntimeError。其初始值为 从创建线程继承;主线程不是守护进程 线程,因此在主线程中创建的所有线程默认为 daemon=False 当

如果在线程运行时按^C,线程是否会获得SIGINT?
如果这是真的,我可以对调用线程做些什么来阻止它将SIGINT传播到正在运行的线程

调用方线程中的信号处理程序将阻止它?
还是每个线程都需要信号处理器

如中所述,您应该使用属性守护进程

守护进程:一个布尔值,指示此线程是否为守护进程 线程(真)与否(假)。必须在启动()之前设置此选项 调用,否则将引发RuntimeError。其初始值为 从创建线程继承;主线程不是守护进程 线程,因此在主线程中创建的所有线程默认为 daemon=False

当没有激活的非守护进程线程时,整个Python程序将退出 左

版本2.6中的新功能

要控制CTRL+C信号,您应该通过使用signal.signal(signal\u number,handler)函数更改处理程序来捕获它。子进程继承SIGINT的信号处理程序

import threading
import time

def worker(i):

    while True:
        try:
            print i
            time.sleep(10)
            break
        except Exception, msg:
            print msg



threads = []
for i in range(10):
    t1 = threading.Thread(target=worker, args=(i,))
    threads.append(t1)

for t in threads:
    t.start()


print "started all threads... waiting to be finished"
for t in threads:
    t.join()
如中所述,您应该使用属性守护进程

守护进程:一个布尔值,指示此线程是否为守护进程 线程(真)与否(假)。必须在启动()之前设置此选项 调用,否则将引发RuntimeError。其初始值为 从创建线程继承;主线程不是守护进程 线程,因此在主线程中创建的所有线程默认为 daemon=False

当没有激活的非守护进程线程时,整个Python程序将退出 左

版本2.6中的新功能

要控制CTRL+C信号,您应该通过使用signal.signal(signal\u number,handler)函数更改处理程序来捕获它。子进程继承SIGINT的信号处理程序

import threading
import time

def worker(i):

    while True:
        try:
            print i
            time.sleep(10)
            break
        except Exception, msg:
            print msg



threads = []
for i in range(10):
    t1 = threading.Thread(target=worker, args=(i,))
    threads.append(t1)

for t in threads:
    t.start()


print "started all threads... waiting to be finished"
for t in threads:
    t.join()
如果在线程运行时按^C,线程是否会获得SIGINT

不可以。在Python中,只有主线程接收SIGINT

不幸的是,我不知道python源代码或文档中有什么好的链接位置,但您可以通过一个简单的测试看到这一点:

import threading
import time
import signal


def worker(i):
    while True:
        try:
            print(i)
            time.sleep(10)
            break
        except Exception as msg:
            print(msg)


def signal_handler(signal, frame):
    print('You pressed Ctrl+C!')
    print("I will wait for all threads... waiting to be finished")
    for t in threads:
        t.join()

signal.signal(signal.SIGINT, signal_handler)

threads = []
for i in range(10):
    t1 = threading.Thread(target=worker, args=(i,))
    threads.append(t1)

for t in threads:
    t.start()

print("started all threads... waiting to be finished")
for t in threads:
    t.join()
使用^C发送SIGINT后,您将看到主线程被终止(不再有“父线程”日志),子线程继续运行

在您的示例中,您的子线程退出是因为
循环10秒后中断

如果在线程运行时按^C,线程是否会获得SIGINT

不可以。在Python中,只有主线程接收SIGINT

不幸的是,我不知道python源代码或文档中有什么好的链接位置,但您可以通过一个简单的测试看到这一点:

import threading
import time
import signal


def worker(i):
    while True:
        try:
            print(i)
            time.sleep(10)
            break
        except Exception as msg:
            print(msg)


def signal_handler(signal, frame):
    print('You pressed Ctrl+C!')
    print("I will wait for all threads... waiting to be finished")
    for t in threads:
        t.join()

signal.signal(signal.SIGINT, signal_handler)

threads = []
for i in range(10):
    t1 = threading.Thread(target=worker, args=(i,))
    threads.append(t1)

for t in threads:
    t.start()

print("started all threads... waiting to be finished")
for t in threads:
    t.join()
使用^C发送SIGINT后,您将看到主线程被终止(不再有“父线程”日志),子线程继续运行


在您的示例中,您的子线程退出是因为
循环10秒后中断了

我想明确地加入它们。如果子线程继承了信号处理程序,每个线程会否尝试加入线程(列表)?对于线程中的t:t.join(),该块是一次调用的还是由所有线程调用的?我想明确地连接它们。如果子线程继承了信号处理程序,每个线程是否会尝试连接线程(列表)?对于线程中的t:t.join(),该块是一次调用的还是由所有线程调用的?