Wenn Sie auf unterschiedliche Steckdosen im selben Thread zu hören, verwenden Sie einen poller:
ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)
Register Steckdosen mit pollern (POLLIN
Streams für eingehende Nachrichten)
ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)
Wenn Polling, Verwendung eine Schleife:
while(notInterrupted()){
poller.poll()
//subscriber registered at index '0'
if(poller.pollin(0))
subscriber.recv(ZMQ.DONTWAIT)
//puller registered at index '1'
if(poller.pollin(1))
puller.recv(ZMQ.DONTWAIT)
}
Wählen Sie, wie Sie abfragen möchten ...
poller.poll()
blockiert, bis Daten auf beiden Sockeln vorhanden sind.
poller.poll(1000)
Blöcke für 1s, dann Timeout.
Der Poller benachrichtigt, wenn Daten (Nachrichten) auf den Sockets verfügbar sind; es ist deine Aufgabe, es zu lesen.
Beim Lesen, ohne zu blockieren: socket.recv(ZMQ.DONTWAIT)
. Auch wenn poller.pollin(0)
prüft, ob Daten gelesen werden sollen, möchten Sie keine blockierenden Aufrufe in der Abfrageschleife vermeiden. Andernfalls könnten Sie den Abfragesender aufgrund von "steckengebliebenem" Socket blockieren. So
, wenn zwei separate Nachrichten an subscriber
gesendet werden, müssen Sie subscriber.recv()
zweimal berufen, um den Poller zu löschen, sonst, wenn Sie subscriber.recv()
einmal anrufen, wird die poller halten Sie sagen, es gibt eine andere Nachricht gelesen werden. Im Wesentlichen verfolgt der Abfrager die Verfügbarkeit und die Anzahl der Nachrichten, nicht die tatsächlichen Nachrichten.
Sie sollten die Polling-Beispiele durchlaufen und mit dem Code spielen, es ist der beste Weg zu lernen.
Beantwortet das Ihre Frage?
Können Sie deutlicher angeben, was Ihre spezifischen Fragen sind? – xaxxon