Je dois définir timeout sur la méthode socket recv de python. Comment faire?
Réponses
Trop de publicités?L'approche classique consiste à utiliser select() pour attendre jusqu'à ce que les données sont disponibles ou jusqu'à ce que le délai d'attente se produit. Seulement appel recv()
lorsque les données sont disponibles. Pour être sûr, nous avons également établi la socket non bloquant mode de garantir que recv()
ne sera jamais bloquer indéfiniment. select()
peut également être utilisé pour attendre plus d'un socket à un moment.
import select
mysocket.setblocking(0)
ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
data = mysocket.recv(4096)
Si vous avez un grand nombre de descripteurs de fichiers ouverts, poll() est une alternative plus efficace à l' select()
.
Une autre option est de définir un délai d'attente pour toutes les opérations sur le support à l'aide de socket.settimeout()
, mais je vois que vous avez explicitement rejeté cette solution dans une autre réponse.
il y a socket.settimeout()
Comme mentionné, select.select()
et socket.settimeout()
fonctionneront.
Notez que vous devrez peut-être appeler deux fois settimeout
pour vos besoins, par exemple:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# accept can throw socket.timeout
sock.settimeout(5.0)
conn, addr = sock.accept()
# recv can throw socket.timeout
conn.settimeout(5.0)
conn.recv(1024)