2013-06-17 1 views
6

ZeroMQ를 사용하는 동안 파이썬 응용 프로그램을 닫는 데 문제가 있습니다. 먼저 실행되지 않는 서버에 연결하십시오!죽은 서버가있는 ZeroMQ를 사용하는 동안 Python 스크립트 종료

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) 

sockets = dict(poller.poll(1000)) 

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

응답

을 기다리고 내 메시지

socket.send(msg) 

를 보내기 때문에 서버는 메시지가 전송되지는 않습니다 죽은 아무런 응답이 없습니다. 그것은 사실입니다. 소켓을 닫고 폴러에서 등록을 취소 한 다음 새로운 소켓으로 살아있는 서버에 연결하면 소켓을 통해 메시지를 보내고 응답을받습니다.

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 

그 후 응용 프로그램 (파이썬 스크립트)이 닫히지 않았습니다 (종료)! 내 문제 야. [sig_term으로 응용 프로그램을 닫을 수 있지만 어떤 이유로 든 사용하지 않을 것입니다.] 죽은 서버에 첫 번째 메시지를 보내지 않으면 응용 프로그램이 정말로 닫힙니다. 나는 문제가 ZeroMQ io 스레드라고 생각하지만 해결할 수는 없다.

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

답변

6

ZeroMQ의 LINGER behaviour이 발생했습니다. LINGER는 Context.term이 메시지를 버리는 것을 허용하기 전에 Context가 기다려야하는 시간을 정의합니다. ZeroMQ 2.x의 기본값은 영원합니다. ZeroMQ 3.x의 기본값은 1 초입니다. 소켓에 짧은 시간 밖에 머물러지지 않는다고 말하면 스크립트는 잘 끝내야합니다.

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가 작동합니다. – GHHT

관련 문제