2013-08-07 16 views
34

Jestem zdezorientowany, co faktycznie robi poller w zmq. Węzeł idzie do niego minimalnie i opisuje go tylko jako sposób na odczyt z wielu gniazd. Nie jest to dla mnie satysfakcjonująca odpowiedź, ponieważ nie wyjaśnia, jak mieć gniazda Timeout. Wiem, że zeromq: how to prevent infinite wait? wyjaśnia dla push/pull, ale nie req/rep wzorów, które jest to, co chcę wiedzieć, jak używać.Jak działa polder Zmq?

Próbuję zapytać: Jak działa poller i jak jego funkcja ma zastosowanie do śledzenia gniazd i ich próśb?

+0

Czy możesz dokładniej określić, jakie są Twoje konkretne pytania? – xaxxon

Odpowiedz

49

Kiedy trzeba słuchać na różnych gniazd w tym samym wątku, użyj poller:

ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB) 
ZMQ.Socket puller = ctx.socket(ZMQ.PULL) 

gniazda zarejestrować się Poller (POLLIN nasłuchuje przychodzących wiadomości)

ZMQ.Poller poller = ZMQ.Poller(2) 
poller.register(subscriber, ZMQ.Poller.POLLIN) 
poller.register(puller, ZMQ.Poller.POLLIN) 

Podczas odpytywania, używać pętla:

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) 
} 

Wybierz sposób ankiety ...

poller.poll() bloków, dopóki nie ma danych na żadnym z gniazd.
poller.poll(1000) blokuje przez 1s, a następnie wychodzi.

Poller powiadamia o dostępności danych (wiadomości) na gniazdach; Twoim zadaniem jest przeczytać to.

Podczas czytania należy to zrobić bez blokowania: socket.recv(ZMQ.DONTWAIT). Mimo że poller.pollin(0) sprawdza, czy są dane do odczytania, chcesz uniknąć blokowania wywołań wewnątrz pętli odpytywania, w przeciwnym razie mógłbyś zablokować poller z powodu "zablokowania" gniazda.

Tak więc, jeśli dwie oddzielne wiadomości są wysyłane do subscriber, trzeba powołać subscriber.recv() dwa razy w celu oczyszczenia poller, w przeciwnym razie, jeśli zadzwonisz subscriber.recv() raz, poller będzie powtarzają się tam kolejna wiadomość do odczytu. Zasadniczo, poller śledzi dostępność i liczbę wiadomości, a nie faktyczne wiadomości.

Powinieneś przejść przez przykłady odpytywania i grać z kodem, jest to najlepszy sposób na naukę.

Czy to odpowiada na twoje pytanie?

+1

Tego właśnie szukałem, dziękuję. – user1876508

+0

Skąd możemy wiedzieć, ile razy powinniśmy wywołać 'subscriber.recv()', aby wyczyścić poller? – Meysam