python: не может завершить поток, зависший в вызове socket.recvfrom () - PullRequest
0 голосов
/ 06 апреля 2010

Я не могу найти способ завершить поток, зависший в вызове socket.recvfrom ().Например, ctrl + c, который должен вызвать исключение KeyboardInterrupt, не может быть перехвачен.Вот скрипт, который я использовал для тестирования:

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 ]

4 голосов
/ 06 апреля 2010

Прерывания клавиатуры всегда перехватываются в основном потоке, а не в дочерних.Чтобы не поддерживать процесс server_thread активным при выходе из основного потока, выполните

server_thread.daemon = True

перед вызовом server_thread.start().

Кстати, ваш while True: pass в основном потоке не нуженгорение циклов процессора.Вы должны по крайней мере изменить его на что-то вроде while True: time.sleep(1.0).Но это не меняет семантику вашего кода - просто понижает его с 99% процессора или около того до (я бы предположил) <5%; -). </p>

1 голос
/ 06 апреля 2010

Вы должны открыть канал от основного потока к сетевому потоку и «выбрать» как на сокете, так и на канале. Если вы хотите завершить сетевой поток, просто отправьте байт через канал из основного потока и действуйте соответствующим образом в сетевом потоке.

Только мои 2 цента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...