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?
Czy możesz dokładniej określić, jakie są Twoje konkretne pytania? – xaxxon