150 votes

Comment définir le délai d'expiration sur la méthode socket recv de python?

Je dois définir timeout sur la méthode socket recv de python. Comment faire?

141voto

Daniel Stutzbach Points 20026

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.

72voto

nosklo Points 75862

52voto

ubershmekel Points 2254

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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X