Erholt von der zmq.Fehler.ZMQError: Address already in use
Drücke ich Strg-C während der Ausführung eines PAIR
Muster (non-blocking client-Server) Verbindung mit der ZMQ. Später, wenn ich versuchte, läuft der REQ-REP
(Blockierung client-single server-Verbindung) Muster, ich bekomme die Address already in use
Fehler. Ich habe versucht mit netstat mit netstat -ltnp | grep :<my port>
aber das bedeutet nicht Liste jeder Prozess.
Also, wer genau ist mit dieser Adresse?
Auch wie funktioniert eine ordnungsgemäß Herunterfahren socket-verbindungen wie diesen?
- Post code illustriert die Nutzung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Frage 1:
Wenn Sie
sudo netstat -ltnp
auf einem Linux-Typ-Betriebssystem, werden Sie wahrscheinlich sehen, den Prozess der Besitz des Hafens. Töten Sie mitkill -9 <pid>
.Frage 2:
Wenn Sie das Programm beenden, schließen Sie Ihre Steckdosen und rufen Sie dann zmq_ctx_destroy(). Dies zerstört den Zusammenhang. Sehen http://zguide.zeromq.org/page:all#toc17 für mehr info.
netstat -ltnp
benötigt zusätzliche Argumente — diese Argumente geben mir die Hilfe-Nachricht. Ich kann auch führen Sie es alsnetstat -ltnp tcp
und listet alle TCP-verbindungen, aber die zeigt nicht die PID. Es ist möglich, dassnetstat
unterscheidet sich unter Mac OS X als auf anderen Betriebssystemen.Manchmal eine andere zeromq-mit Prozess, hält der port in Gebrauch ist, und
netstat
nicht darauf hin, dass andere Prozess hören (sonetstat -lntp
nicht zeigen), sondern zeigt eine bestehende Verbindung auf dem port mit dem gleichen host/port an beiden enden. Nach der Tötung, die anderen Prozess, der port ist nun für die Verwendung zur Verfügung.Grund #1: ich habe diese passieren, denn ich hatte die zeromq-listening-ports einrichten, die in den Bereich der temporären ports (auf linux z.B. 32768-61000), dass man als die lokale Seite der ausgehenden verbindungen, und meine Dienste benötigen, um eine Verbindung zu anderen Diensten auf der gleichen box. Ein Prozentsatz der Zeit, in der eine ausgehende Verbindung bekommt einen temporären port, dass ist das gleiche wie ein listening-port auf der box, und plötzlich "address already in use". Ich zog alle listening-ports unten aus dem Weg des ephemeral port range und alle die "address already in use" - Fragen ging.
Grund #2: Spekulation: Wenn ich schon in ähnliche Probleme mit anderen python-Netzwerk-Bibliotheken, die problematischen Prozess wurde zuvor gestartet vom hören-Prozess mit Unterprozess oder ähnlich, und es gab ein problem mit der Steckdose lecken bis der Kind-Prozess; wenn der parent-Prozess beendet wurde, ohne das schließen des socket die socket-gelassen, lebendig und im Besitz der Kind-Prozess, und auch wenn der Kind-Prozess nicht wirklich wissen, etwas über die socket-es wäre immer noch gemacht werden, damit andere Prozesse konnte es nicht verwenden.
Wenn das ist das Problem, es könnte sein, fixierbar durch optimieren der flags der Steckdose, bevor Sie den Teilprozess, z.B. (unix-spezifisch):
Oder vielleicht gibt es einen Weg, um mehr ordnungsgemäß schließen Sie die Steckdose im übergeordneten Prozess.
In diesem moment:
Weiter:
beginnen mit
try:
/except:
/finally:
Kapselung, Konstruktoren, das wird helfen, Sie zu gewähren einen gesegneten Ausgang von allen zmq Zuweisungen, inkl. alle Buchse-s'.close()
und Kontext's.Term()
ohne hängen Waise(N) ein memory leak(s), auch im Falle einer Panik-Taste oder unbehandelte Ausnahme unterbricht die code-Ausführung zusammen mit dem Verlust Referenzen zu Ihrem stil hängen, Netzwerk-hardware gebunden, Instanzen.