Ich habe ein Python-Programm, das mehrere (etwa 5-6) lange Abfrageanforderungen parallel unter Verwendung verschiedener Threads für jede Abfrage über das Anforderungspaket sendet. Und mir ist aufgefallen, dass einige meiner Themen manchmal einfach erstarren. Wenn dies geschieht, empfängt der Server, an den ich die Anfrage sende, die Anfrage nicht. Auch habe ich eine Zeitüberschreitung bei der Anfrage eingestellt und es funktioniert nicht.
%Vor%Ich mache das auf Raspberry Pi 2 Hardware mit Raspbian OS.
Ich habe das gleiche Programm ohne Probleme benutzt, als ich Python 2.7 benutzt habe. Kürzlich bin ich zu Python 3.5 gewechselt. Ich testete mit beiden Anfragen Versionen mit 2.8.1 und 2.9.1.
Dieses Problem tritt nicht sehr häufig auf, aber es passiert 2-3 Mal pro Tag auf verschiedenen Threads.
Was könnte das Problem sein? Wie kann ich das debuggen?
Bearbeiten: Das Problem wird durch Aktualisieren des Linux-Kernels behoben.
Laut der Dokumentation:
Es sollte eine Timeout
-Ausnahme ausgelöst werden, wenn die Zeitüberschreitung auftritt. Das würde bedeuten, dass die Zeile:
Würde nie heißen, dass tatsächlich ein Timeout auftritt.
Fangen Sie die Ausnahme? Oder irgendeine andere Ausnahme? Es könnte sein, dass es gut läuft, aber das sieht man nicht. Vielleicht versuche so etwas:
%Vor%So können Sie sehen, ob das so ist.
EDIT: möglicherweise ist es der "connect" Schritt, der nicht richtig ausgeht. Es kann sein, dass der große Timeout-Wert für den "Verbindungs" -Schritt es irgendwie vermasselt. Vielleicht versuchen Sie es mit einem kürzeren Timeout (wie hier erwähnt):
z.B.
%Vor%Falls dies nicht möglich ist, kann es sich um ein DNS-Lookup-Problem handeln. Vielleicht sehen Sie, ob das Hardcoding der IPs das gleiche Problem darstellt?
Mein Problem mit Timern (vom Threading Import Timer) gelöst. Wenn in den nächsten 10 Sekunden kein Ergebnis angezeigt wird - wiederholen Sie den Vorgang, wenn in den nächsten 10 Sekunden kein Ergebnis angezeigt wird - drucken Sie "Fehler" und fahren Sie fort. Sie können den Timer-Status nicht mit der if-Anweisung überwachen, wenn die Anforderung einfriert, aber Sie können dies über die while-Schleife tun und Zeit hinzufügen, wenn das Ergebnis in Ordnung ist ( Python: Code alle n Sekunden ausführen und Timer unter Bedingung neu starten ).
Tags und Links python multithreading long-polling python-requests