2013-06-17 12 views
6

私はZeroMQを使用している間にpythonアプリケーションを終了する際に問題があります。 最初に実行していないサーバーに接続します。デッドサーバで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 

その後、アプリケーション(pythonスクリプト)が閉じられない(終了する)!それは私の問題です。 [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

関連する問題