我无法找到终止socket.recvfrom()调用中挂起的线程的方法。例如,无法捕获应该触发KeyboardInterrupt异常的ctrl + c。这是我用于测试的脚本:
from socket import *
from threading import Thread
from sys import exit
class TestThread(Thread):
def __init__(self,host="localhost",port=9999):
self.sock = socket(AF_INET,SOCK_DGRAM)
self.sock.bind((host,port))
super(TestThread,self).__init__()
def run(self):
while True:
try:
recv_data,addr = self.sock.recvfrom(1024)
except (KeyboardInterrupt, SystemExit):
sys.exit()
if __name__ == "__main__":
server_thread = TestThread()
server_thread.start()
while True: pass
主线程(执行无限循环的线程)退出。但是,我明确创建的线程一直挂在recvfrom()。
请帮我解决这个问题。
答案 0 :(得分:4)
键盘中断总是被主线程捕获 - 永远不会出现在“子”线程上。为了避免{?1}在主线程退出时保持进程处于活动状态,请执行
server_thread
在致电server_thread.daemon = True
之前。
顺便说一下,主线程中的server_thread.start()
不必要地烧掉了CPU周期。您至少应该将其更改为while True: pass
之类的内容。但这并没有改变你的代码的语义 - 只是将它从99%CPU左右降低到(我猜)< 5%; - 。)
答案 1 :(得分:1)
您应该打开从主线程到网络线程的管道,并在套接字和管道上“选择”。当你想终止网络线程时,只需从主线程通过管道发送一个字节,并在网络线程中采取相应的行动。
只需2美分。