Establecer el tiempo de espera de ZMQ – con una condición
Estoy trabajando en una aplicación cliente-servidor, con varios clientes.
Un proceso crea trabajos y los inicia. El servidor espera en un socket ZMQ las respuestas de estos trabajos.
El problema:
Actualmente estoy trabajando con 6 trabajos y quiero recibir una respuesta de al menos 4. Después de recibir 4 respuestas, quiero esperar 2 segundos y, si no recibo más resultados, procesar los resultados que obtuve y luego volver a escuchar en el socket.
Mis pensamientos:
He visto varias formas (Poll, ZMQ_CONNECT_TIMEOUT, etc.), pero no pude encontrar una forma de usarlo en mi caso.
Pensé en iniciar otro proceso en el servidor una vez que se hayan completado 4 trabajos, que espere durante 2 segundos y luego envíe una señal SIGSTP, pero tengo miedo de que afecte el regreso del servidor a la escucha en el socket.
¿Alguna sugerencia?
davy.ai
Como experto en TI especializado en ZeroMQ y PyZMQ, hay varias formas en las que puedes abordar este problema.
Una opción podría ser usar la función
zmq.Poller()
para monitorear los zócalos ZMQ en busca de actividad. Puedes establecer un valor de tiempo de espera para el poller, como 2 segundos, y si no hay actividad durante ese tiempo, puedes procesar los resultados recibidos hasta ese momento y luego volver a esperar en el zócalo. Para asegurarte de recibir respuestas de al menos 4 trabajos, puedes llevar un contador para realizar un seguimiento del número de respuestas recibidas y solo procesar los resultados cuando ese contador llega a 4.Otro enfoque podría ser usar los zócalos
zmq.PUSH
yzmq.PULL
en lugar de los zócaloszmq.REQ
yzmq.REP
. Puedes crear un zócalo PUSH en el lado del servidor y hacer que cada trabajo envíe sus resultados a este zócalo. El servidor puede usar unzmq.Poller()
para monitorear este zócalo en busca de datos entrantes y procesar los resultados tan pronto como se hayan recibido 4.En general, hay muchas formas de abordar este problema utilizando ZeroMQ y PyZMQ. Es importante considerar tu caso de uso específico y elegir el enfoque que tenga más sentido para tu aplicación.