2013-06-17 9 views
6

Ho un problema nel chiudere un'applicazione python mentre utilizzo ZeroMQ. prima mi collego a un server che non è in esecuzione!Terminazione dello script Python mentre si utilizza ZeroMQ con server morto

context = zmq.Context() 
socket = context.socket(zmq.REQ) 
socket_id = randomID() 
socket.setsockopt(zmq.IDENTITY, socket_id) 
socket.connect("tcp://dead_server") 
poller = zmq.Poller() 
poller.register(socket, zmq.POLLIN) 

e invio il mio messaggio

socket.send(msg) 

in attesa di risposta

sockets = dict(poller.poll(1000)) 

if sockets.get(socket) == zmq.POLLIN: 
    result = socket.recv() 
    print (result) 

modo che il server è morto il messaggio non verrà inviare e non v'è alcuna risposta. è vero lavoro. poi chiudo il socket e lo annullo dal poller, quindi mi collego al server vivo con un nuovo socket e invio il messaggio dal socket e ottengo una risposta da esso.

poller.unregister(socket) 
socket.close() 

socket = context.socket(zmq.REQ) 
socket.setsockopt(zmq.IDENTITY, socket_id) 
poller.register(socket, zmq.POLLIN) 
socket.connect("tcp://alive_server") 
socket.send(msg) 

sockets = dict(poller.poll(1000)) 

if sockets.get(socket) == zmq.POLLIN: 
    result = socket.recv() 
    print (result) 

# Every thing ok up to hear 

dopo di esso l'applicazione (script python) non è chiusa (termina)! è un mio problema [Posso chiudere l'applicazione con sig_term ma non lo userò per qualche motivo.] se non invio il primo messaggio al server morto l'applicazione è chiusa veramente. Immagino che il problema sia ZeroMQ io thread ma non riesco a risolverlo.

exit(0) # Not worked 
sys.exit(0) # Not worked 

risposta

6

Si è verificato ZeroMQ di LINGER behaviour. LINGER definisce per quanto tempo il contesto deve attendere prima di consentire a Context.term di eliminare i messaggi. Il valore predefinito in ZeroMQ 2.x è per sempre e il valore predefinito in ZeroMQ 3.x è un secondo. Se dici alle tue prese che dovrebbero fermarsi solo per poco tempo, il tuo script dovrebbe uscire proprio bene:

socket = context.socket(zmq.REQ) 
socket_id = randomID() 
socket.identity = ramdomID() 
socket.linger = 250 # 250ms = 1/4 s 
socket.connect("tcp://dead_server") 
+0

tnx, ha funzionato. – GHHT

Problemi correlati