Завершить sockert.recv в потоке в Python - PullRequest
2 голосов
/ 21 октября 2010

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

def ackListener(self):

    while self.waitingforack:
        ack = self.socket_agent.recv(4)
        ...
    exit()

, где self.waitingforack - логическое значение, которое я установил на False, когда получил подтверждение для каждого отправленного сообщения.

Проблема в том, что мой код блокируется при операции self.socket_agent.recv(4), изменение значения waitingforack выполнено слишком поздно

Есть ли способ заставить поток завершиться, когда я больше не жду подтверждения?

Спасибо

1 Ответ

3 голосов
/ 21 октября 2010

Помните, что такие операции, как recv, блокируют операции в вашем случае. Таким образом, вызывая эти функциональные блоки, если вы не получили данные.

Есть два способа сделать это:

Сделать розетку без блокировки

socket.setblocking(0)

Установить значение тайм-аута см .: http://docs.python.org/library/socket.html#socket.socket.settimeout

socket.settimeout(value)

Использовать асинхронный подход

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