python:无法终止在socket.recvfrom()调用中挂起的线程

时间:2010-04-06 14:40:41

标签: python multithreading

我无法找到终止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()。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:4)

键盘中断总是被主线程捕获 - 永远不会出现在“子”线程上。为了避免{?1}在主线程退出时保持进程处于活动状态,请执行

server_thread
在致电server_thread.daemon = True 之前

顺便说一下,主线程中的server_thread.start()不必要地烧掉了CPU周期。您至少应该将其更改为while True: pass之类的内容。但这并没有改变你的代码的语义 - 只是将它从99%CPU左右降低到(我猜)< 5%; - 。)

答案 1 :(得分:1)

您应该打开从主线程到网络线程的管道,并在套接字和管道上“选择”。当你想终止网络线程时,只需从主线程通过管道发送一个字节,并在网络线程中采取相应的行动。

只需2美分。