La buona notizia è che, come di ZMQ 3.0 e versioni successive (l'epoca moderna), è possibile impostare un timeout su un socket. Come altri hanno notato altrove, è necessario farlo dopo aver creato il socket, ma prima di collegarlo:
zmq_req_socket.setsockopt(zmq.RCVTIMEO, 500) # milliseconds
Poi, quando in realtà tenta di ricevere la risposta (dopo aver inviato un messaggio al la presa REP), è possibile rilevare l'errore che verrà affermato se il timeout è superato:
try:
send(message, 0)
send_failed = False
except zmq.Again:
logging.warning("Image send failed.")
send_failed = True
Tuttavia! Quando ciò accade, come osservato altrove, il tuo socket si troverà in uno stato divertente, perché sarà comunque in attesa della risposta. A questo punto, non riesco a trovare nulla che funzioni in modo affidabile diverso dal semplice riavvio del socket.Notare che se si disconnette() il socket e quindi si riconnette() esso, sarà ancora in questo stato negativo. Quindi è necessario
def reset_my_socket:
zmq_req_socket.close()
zmq_req_socket = zmq_context.socket(zmq.REQ)
zmq_req_socket.setsockopt(zmq.RCVTIMEO, 500) # milliseconds
zmq_req_socket.connect(zmq_endpoint)
Noterete anche che, poiché chiudo() D la presa, l'opzione di ricezione di timeout è stato "perso", quindi è importante insieme che sul nuovo socket.
Spero che questo aiuti. E spero che questa non sia la migliore risposta a questa domanda. :)
Si potrebbe desiderare di passare ad uno dei router/DEALER base affidabile Richiesta Risposta (AKA pirata) modelli descritto nella [guida] (http://zguide.zeromq.org/page : tutti i # Chapter-Reliable-Request-Reply-Patterns) –