2013-06-17 13 views
6

ZeroMQ kullanırken python uygulamasını kapatma konusunda bir sorunum var. önce çalışmıyor bir sunucuya bağlanıyorum!ZeroMQ'yi ölü sunucuyla kullanırken python komut dosyasının sonlandırılması

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) 

ve

sockets = dict(poller.poll(1000)) 

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

cevapta

bekliyor mesajımı

socket.send(msg) 

gönderme böylece sunucu mesaj göndermez edilecek öldü ve hiçbir cevap yoktur. bu doğrudur. sonra soketi kapatıyorum ve pollerden siliyorum sonra yeni sunucu ile canlı sunucuya bağlanın ve ben soket tarafından mesaj gönderirim ve ondan cevap alırım.

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 

ondan sonra uygulama (python komut dosyası) kapalı değil (sonlandırmak)! bu benim problemim. [sig_term ile uygulamayı kapatabilirim ama bir sebepten dolayı kullanmayacağım.] Eğer ölü sunucuya ilk mesaj göndermediğimde uygulama gerçekten kapalı. Sanırım sorun ZeroMQ io iş parçacığı ama çözemiyorum.

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

cevap

6

Sen ZeroMQ en LINGER behaviour karşılaşıyorsunuz. LINGER, Bağlamın iletileri atmak için Context.term'a izin vermeden önce ne kadar beklemesi gerektiğini tanımlar. ZeroMQ 2.x'deki varsayılan değer sonsuzdur ve ZeroMQ 3.x'teki varsayılan bir saniyedir. Soketinize sadece kısa bir süre dinlenmeleri gerektiğini söylerseniz, komut dosyanızın düzgün olarak çıkması gerekir:

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, işe yaradı. – GHHT

İlgili konular