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