2013-08-07 3 views
34

Ich bin verwirrt, was Poller tatsächlich in zmq tut. Der Zguide geht minimal darauf ein und beschreibt ihn nur als eine Möglichkeit, von mehreren Sockeln zu lesen. Dies ist keine befriedigende Antwort für mich, weil es nicht erklärt, wie man Timeout-Sockets hat. Ich weiß zeromq: how to prevent infinite wait? erklärt für push/pull, aber nicht req/rep Muster, was ich wissen will, wie man es benutzt.Wie funktioniert zmq poller?

Was ich zu fragen versuche, ist: Wie funktioniert der Poller und wie funktioniert er, um Sockets und ihre Anfragen zu verfolgen?

+0

Können Sie deutlicher angeben, was Ihre spezifischen Fragen sind? – xaxxon

Antwort

49

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?

+1

Genau das habe ich gesucht, danke. – user1876508

+0

Wie können wir wissen, wie oft wir 'subscriber.recv()' aufrufen müssen, um den Poller zu löschen? – Meysam