2013-06-17 16 views
6

Mam problem z zamykaniem aplikacji Pythona podczas korzystania z ZeroMQ. Najpierw łączę się z serwerem, który nie działa!Zakończenie skryptu Pythona podczas korzystania z ZeroMQ ze zdalnym serwerem

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) 

i wysyłanie moją wiadomość

socket.send(msg) 

czekając na odpowiedź

sockets = dict(poller.poll(1000)) 

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

więc serwer jest martwy komunikat nie będzie wysyłać i nie ma odpowiedzi. to działa prawdą. następnie zamykam gniazdo i wyrejestrowuję go z pollera, a następnie łączę się z serwerem żywym z nowym gniazdem i wysyłam wiadomość przez gniazdo i otrzymuję od niej odpowiedź.

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 

po tym aplikacja (skrypt python) nie jest zamknięta (zakończ)! to jest mój problem. [Mogę zamknąć aplikację pod numerem sig_term, ale nie będę z niej korzystać z jakiegoś powodu.] Jeśli nie wyślę pierwszej wiadomości do martwego serwera, aplikacja zostanie naprawdę zamknięta. Domyślam się, że problemem jest wątek ZeroMQ io, ale nie mogę go rozwiązać.

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

Odpowiedz

6

Zauważyłeś LINGER behaviour ZeroMQ. LINGER określa, jak długo Kontekst powinien poczekać, zanim zezwoli na odrzucenie komunikatów przez Context.term. Wartość domyślna w ZeroMQ 2.x jest na zawsze, a domyślna w ZeroMQ 3.x to jedna sekunda. Jeśli powiesz swojemu gniazdu, że powinny one pozostać tylko przez krótki czas, twój skrypt powinien zakończyć poprawnie:

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, zadziałało. – GHHT

Powiązane problemy