объект сокета python принимает время ожидания - PullRequest
10 голосов
/ 09 сентября 2011

Вопрос: Есть ли какое-то время ожидания или прерывание для функции socket.accept () в python?


Информация:

У меня есть программа, у которой есть дочерний элементпоток связан с портом и постоянно принимает и отслеживает и передает их в очередь для основного потока.Прямо сейчас я пытаюсь заставить дочерний поток прерываться, чтобы он мог соответствующим образом деконструироваться.Я думаю, что я могу просто остановить дочерний поток и сделать так, чтобы родительский элемент деконструировал дочерний, но в других случаях я хочу иметь возможность вернуть раннее принятие формы, поэтому я просто решил, что это будет наиболее полезным подходом.

Итак, есть ли способ, по которому я могу получить тайм-аут или отменить метод accept, чтобы поток мог вернуть без подключения к нему что-то сначала?

Ответы [ 3 ]

11 голосов
/ 09 сентября 2011

Вы можете установить время ожидания по умолчанию с помощью

import socket
print socket.getdefaulttimeout()
socket.setdefaulttimeout(60)

AFAIK. Это повлияет на все на работу сокета

7 голосов
/ 14 января 2017

Вы можете использовать settimeout(), как в этом примере:

import socket

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
tcpServer.bind(('0.0.0.0', 10000)) # IP and PORT

stopped = False
while not stopped:
  try:
    tcpServer.settimeout(0.2) # timeout for listening
    tcpServer.listen(1) 
    (conn, (ip, port)) = tcpServer.accept() 
  except socket.timeout:
    pass
  except:
    raise
  else:
    # work with the connection, create a thread etc.
    ...

Цикл будет работать до тех пор, пока для stopped не будет установлено значение true, а затем завершится через (самое большее) установленное вами время ожидания.(В моем приложении я передаю дескриптор соединения во вновь созданный поток и продолжаю цикл, чтобы иметь возможность принимать дальнейшие одновременные соединения.)

7 голосов
/ 09 сентября 2011

Может быть settimeout () - это то, что вы ищете.

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