Ich muss Timeout auf Pythons Socket Recv-Methode festlegen. Wie es geht?Wie Zeitüberschreitung bei Python-Socket Recv-Methode festlegen?
Antwort
Es dauert nicht das recv (Timeout) (zumindest wenn ich es versuchte). Nur das accept() ist abgelaufen. –
Die socket.recv() scheint für mich nach dem Festlegen von socket.settimeout(), genau wie geplant, Timeout. Entwerfe ich das? Kann jemand anderes das bestätigen? – Aeonaut
@Aeonaut Ich denke, dass dies die meiste Zeit recv() ausläuft, aber es gibt eine Wettlaufbedingung. In socket.recv() Python (2.6) -Aufrufen intern mit dem Timeout auswählen/abfragen und dann wird recv() direkt danach aufgerufen. Wenn Sie also einen blockierenden Sockel verwenden und zwischen diesen beiden Aufrufen der andere Endpunkt abstürzt, können Sie auf dem recv() endlos hängen bleiben. Wenn Sie einen nicht blockierenden Socket verwenden, ruft Python intern nicht select.select auf, daher denke ich, dass Daniel Stutzbachs Antwort der richtige Weg ist. –
Der typische Ansatz ist select() zu verwenden, zu warten, bis Daten verfügbar sind oder bis das Timeout auftritt. Rufen Sie recv()
nur an, wenn Daten tatsächlich verfügbar sind. Um sicherzugehen, setzen wir den Socket auch auf den nicht blockierenden Modus, um zu garantieren, dass recv()
niemals unbegrenzt blockiert wird. select()
kann auch verwendet werden, um auf mehrere Sockets gleichzeitig zu warten.
import select
mysocket.setblocking(0)
ready = select.select([mysocket], [], [], timeout_in_seconds)
if ready[0]:
data = mysocket.recv(4096)
Wenn Sie eine Menge offener Dateien haben, ist poll() eine effizientere Alternative zu select()
.
Eine andere Option ist ein Timeout für alle Operationen auf dem Socket mit socket.settimeout()
, aber ich sehe, dass Sie diese Lösung in einer anderen Antwort explizit abgelehnt haben.
Wie erwähnt, funktionieren sowohl select.select()
als auch socket.settimeout()
.
Hinweis: Sie müssen möglicherweise zweimal die settimeout
für Ihre Bedürfnisse anrufen, z.
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)
Ich denke, er ist in der gleichen Sache, in der ich bin, egal, wie Sie diese Funktion stochern und stoßen, es hängt. Ich habe jetzt 2 oder 4 Timeouts ausprobiert und es hängt immer noch. settimeout hängt auch. –
Wenn Sie '.settimeout()' mehr als einmal aufrufen, können Sie die 'setdefaulttimeout()' Methode an erster Stelle aufrufen. – mvarge
Sie Timeout vor Erhalt der Antwort einstellen könnte und nach der Reaktion zurück auf None erhalten zu haben:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5.0)
data = sock.recv(1024)
sock.settimeout(None)
dies versuchen, es den zugrunde liegenden C verwendet
timeval = struct.pack('ll', 2, 100)
s.setsockopt(socket.SOL_SOCKET,SO_RCVTIMEO, timeval)
- 1. Festlegen der Zeitüberschreitung bei der Datenbankverbindung in Python
- 2. Wie Sie IHttpAsyncHandler eine Zeitüberschreitung festlegen?
- 3. Wie Zeitüberschreitung für NHibernate LINQ-Anweisung festlegen
- 4. Zeitüberschreitung bei der Internetübertragungssteuerungsanforderung
- 5. Zeitüberschreitung bei Java-URL-Verbindung
- 6. Wie Zeitüberschreitung in Java beim Lesen von SerialPort festlegen?
- 7. Wie Zeitüberschreitung für Urlfetch in Google App Engine festlegen?
- 8. Wie Zeitüberschreitung in RestClient-Juwel in Ruby festlegen?
- 9. Wie Zeitüberschreitung für http.Get() Anforderungen in Golang festlegen?
- 10. Zeitüberschreitung bei Datenbankverbindung in CodeIgniter 3 einstellen
- 11. Kann die Zeitüberschreitung bei jQuery.post() überprüft werden?
- 12. Kann ich die Zeitüberschreitung für UdpClient in C# festlegen?
- 13. MongoError: Server 127.0.0.1:3000 Zeitüberschreitung bei Null
- 14. Java: Zeitüberschreitung für Threads in einem ThreadPool festlegen
- 15. API Mobile Services Zeitüberschreitung bei gleichzeitigem Zugriff
- 16. Konfigurieren der Zeitüberschreitung bei JSch ChannelSftp-Operationen
- 17. "System.Web.HttpException: Zeitüberschreitung der Anforderung." Fehler bei Response.write
- 18. Win32Exception (0x80004005): Zeitüberschreitung bei der Warteoperation
- 19. Deaktivieren Sie die automatische Neuladefunktion bei Zeitüberschreitung bei Chrome
- 20. Wie Zeitüberschreitung für Jobs in sidekiq
- 21. Zeitüberschreitung für webClient.DownloadFile()
- 22. NSURLConnection Zeitüberschreitung
- 23. HTTP-Keep-Alive-Zeitüberschreitung
- 24. LINQ und .COUNT Zeitüberschreitung
- 25. Zeitüberschreitung der Anforderung - Zeitüberschreitung der Anforderung
- 26. Fehler beim Laden der Ressource: Zeitüberschreitung der Anfrage bei Safari
- 27. UITapGestureRecognizer-Zeitüberschreitung?
- 28. Zeitüberschreitung bei der Protokollierung von System.Net auf Trace-Ebene
- 29. Wie Zeitüberschreitung für DataWithContentsOfURL festgelegt wird: url
- 30. Firefox Verbindung Zeitüberschreitung bei Verwendung von Jmeter Proxy
FYI, wenn Sie wählen Timeouts zu verwenden ... Sie müssen wissen, wie das Timeout behandelt wird. diese SO Frage spricht über die Handhabung, wenn ein Timeout passiert: https://StackOverflow.com/Questions/16745409 –