sockets - socket - ¿Cómo funciona el sondeador zmq?
zmq socket types (1)
Estoy confundido en cuanto a qué hace realmente el sondeador en zmq. Zguide entra mínimamente y solo lo describe como una forma de leer desde múltiples sockets. Esta no es una respuesta satisfactoria para mí porque no explica cómo tener enchufes de tiempo de espera. Sé zeromq: cómo prevenir la espera infinita? explica los patrones push / pull, pero no req / rep, que es lo que quiero saber cómo usar.
Lo que intento preguntar es: ¿cómo funciona el sondeo y cómo se aplica su función para hacer un seguimiento de los sockets y sus solicitudes?
Cuando necesite escuchar en diferentes sockets en el mismo hilo, use un sondeador:
ZMQ.Socket subscriber = ctx.socket(ZMQ.SUB)
ZMQ.Socket puller = ctx.socket(ZMQ.PULL)
Registrar sockets con poller ( POLLIN
escucha los mensajes entrantes)
ZMQ.Poller poller = ZMQ.Poller(2)
poller.register(subscriber, ZMQ.Poller.POLLIN)
poller.register(puller, ZMQ.Poller.POLLIN)
Al sondear, usa un ciclo:
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)
}
Elige cómo quieres sondear ...
poller.poll()
bloquea hasta que haya datos en cualquier socket.
poller.poll(1000)
bloques por 1s, luego agota el tiempo.
El sondeo notifica cuando hay datos (mensajes) disponibles en los sockets; es tu trabajo leerlo.
Al leer, hazlo sin bloquear: socket.recv( ZMQ.DONTWAIT)
. Aunque poller.pollin(0)
comprueba si hay datos para leer, quiere evitar cualquier llamada de bloqueo dentro del ciclo de sondeo, de lo contrario, podría terminar bloqueando el sondeo debido a un socket ''atascado''.
Por lo tanto, si se envían dos mensajes separados al subscriber
, debe invocar subscriber.recv()
dos veces para borrar el sondeo; de lo contrario, si llama a subscriber.recv()
una vez, el sondeador seguirá diciéndole que hay otro mensaje para ser leido. Entonces, en esencia, el sondeador rastrea la disponibilidad y la cantidad de mensajes, no los mensajes reales.
Debería leer los ejemplos de sondeo y jugar con el código, es la mejor manera de aprender.
Eso responde tu pregunta?