2013-06-17 31 views
6

Tôi gặp sự cố khi đóng ứng dụng python trong khi sử dụng ZeroMQ. đầu tiên tôi kết nối với một máy chủ không chạy!Chấm dứt tập lệnh python trong khi sử dụng ZeroMQ với máy chủ chết

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) 

và gửi thông điệp của tôi

socket.send(msg) 

chờ đợi trả lời

sockets = dict(poller.poll(1000)) 

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

nên máy chủ đã chết thông báo sẽ được gửi không và không có trả lời. nó hoạt động đúng. sau đó tôi đóng socket và unregister nó từ poller sau đó kết nối với máy chủ còn sống với ổ cắm mới và tôi gửi tin nhắn bằng ổ cắm và nhận được trả lời từ nó.

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 

sau khi ứng dụng (tập lệnh python) không bị đóng (chấm dứt)! đó là vấn đề của tôi. [Tôi có thể đóng ứng dụng với sig_term nhưng tôi sẽ không sử dụng nó vì một số lý do.] nếu tôi không gửi tin nhắn đầu tiên tới máy chủ chết, ứng dụng sẽ bị đóng thực sự. Tôi đoán vấn đề là ZeroMQ io thread nhưng tôi không thể giải quyết nó.

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

Trả lời

6

Bạn đang gặp phải Zero2Q LINGER behaviour. LINGER định nghĩa bối cảnh phải đợi bao lâu trước khi cho phép Context.term loại bỏ thư. Mặc định trong ZeroMQ 2.x là mãi mãi, và mặc định trong ZeroMQ 3.x là một giây. Nếu bạn nói với các ổ cắm của mình rằng chúng chỉ nên nán lại trong một thời gian ngắn, tập lệnh của bạn nên thoát hoàn toàn:

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, nó hoạt động. – GHHT

Các vấn đề liên quan