zeromq: Wie verhindert man unendliches Warten?
Ich habe gerade angefangen mit der ZMQ. Ich entwerfe eine app, deren Arbeitsablauf ist:
- einer der vielen Kunden (die zufällig PULL-Adressen) DRÜCKEN Sie eine Anfrage an einen server 5555
- der server ist für immer warten für den Kunden Schiebt. Wenn einer kommt und ein worker-Prozess erzeugt wird, für die betreffende Anfrage. Ja, die worker-Prozesse können gleichzeitig existieren.
- Wenn dieser Prozess abgeschlossen ist, es ist Aufgabe, es Drückt das Ergebnis an den client.
Ich nehme an, dass das PUSH/PULL-Architektur ist dafür besonders gut geeignet. Bitte korrigieren Sie mich,.
Aber wie umgehe ich diese Szenarien?
- die client_receiver.recv() wartet, für eine unendliche Zeit, wenn der server nicht antwortet.
- kann die client-Anfrage senden, aber es werden nicht sofort nach, so dass ein worker-Prozess bleibt stecken server_sender.send() auf immer.
So, wie richte ich so etwas wie ein timeout in der PUSH - /PULL-Modell?
BEARBEITEN: Dank user938949 Anregungen, ich habe eine arbeiten Antwort und ich Teile es für die Nachwelt.
InformationsquelleAutor der Frage aitchnyu | 2011-09-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit zeromq >= 3.0, dann können Sie die RCVTIMEO socket-option:
Aber im Allgemeinen, Sie können Abrufe:
Sowie
poller.poll()
nimmt ein timeout:evts
wird eine leere Liste, wenn es nichts zu empfangen.Können Sie die Umfrage mit
zmq.POLLOUT
zu prüfen, ob ein senden gelingen wird.Oder zu behandeln, die bei einem peer, der vielleicht gescheitert ist, ein:
ausreichen könnte, die immer wieder sofort, Sensibilisierung für ein ZMQError(zmq.EAGAIN), wenn das senden nicht abschließen konnte.
InformationsquelleAutor der Antwort minrk
War dies ein quick hack ich gemacht, nachdem ich die genannten user938949 Antwort und http://taotetek.wordpress.com/2011/02/02/python-multiprocessing-with-zeromq/ . Wenn Sie besser machen können, schicken Sie Ihre Antwort, werde ich empfehlen, Ihre Antwort.
Für diejenigen, die dauerhafte Lösungen auf Zuverlässigkeit, beziehen http://zguide.zeromq.org/page:all#toc64
Version 3.0 von zeromq (beta ATM) unterstützt timeout in ZMQ_RCVTIMEO und ZMQ_SNDTIMEO. http://api.zeromq.org/3-0:zmq-setsockopt
Server
Der zmq.NOBLOCK ist sichergestellt, dass, wenn ein client nicht vorhanden ist, wird der send() blockiert nicht.
Client
Das poller-Objekt Zuhören kann auf viele Empfang der sockets (siehe "Python-Multiprocessing mit ZeroMQ" weiter oben verlinkt. Ich verlinkte es nur auf work_receiver. In der Endlosschleife ist, der client fragt mit einem Intervall von 1000ms. Die Socken Objekt gibt leer, wenn keine Nachricht eingegangen ist.
InformationsquelleAutor der Antwort aitchnyu
Dem senden nicht blockieren, wenn Sie ZMQ_NOBLOCK, aber wenn Sie versuchen, schließen Sie die Buchse und Rahmen, dieser Schritt würde das Programm blockieren beenden..
Der Grund dafür ist, dass der socket wartet für jeden peer, so dass die ausgehenden Nachrichten sicherstellen, um in der Warteschlange.. schließen Sie die Steckdose sofort ab und Spülen Sie die ausgehenden Nachrichten aus dem Puffer, verwenden Sie ZMQ_LINGER und legen Sie es auf 0..
InformationsquelleAutor der Antwort Adobri