gevent 13.x から 1.0b4 にアップグレードしました。
5秒ごとに「HUGZ」を送信して、接続が有効かどうかを確認するフェイルオーバーコードがあります。HUGZ が到着しない場合は、別の場所への代替接続が行われます。タイムアウトの動作が変更されたため、このフェイルオーバー メカニズムは機能しなくなりました。
a と the を使用していくつかのテスト コードを作成し、with Timeout
期待どおりに動作しましたが、アプリケーションのコンテキストではまったく同じコードが機能しなくなりました。以前は機能していたフェイルオーバー コード。
with TimeOut
ブロック内のメッセージを受信するために gevent-zeromq を使用していますが、with TimeOut
ブロックは決して「タイムアウト」せずに実行を継続するため、回復コードは実行されません。
タイムアウト メカニズムが機能しない原因は何ですか? 以前は機能していた Timeout コードが機能しなくなりました。
if active_socket:
print 'waiting for message'
with Timeout(2, False):
node_message = NodeMessage.recv(active_socket)
When no message arrives in time, the code block after this text
does not get executed. and it should!! and did before.
logging.info('ping..')
logging.info(node_message.name)
# deal with message from plc_server.
if node_message:
handle_node_message(plc_client, plc_server, node_message)
else:
# no nodemessage or hugz recieved.
# plc_server has died a horrible death? reboot?
recv メソッド:
@classmethod
def recv(cls, socket):
"""Reads name-value message from socket"""
while True:
message = socket.recv()
if message:
return cls.from_message(message)
ソケットは、私がいくつか持っている接続オブジェクトで初期化されています。
from gevent import Timeout
from gevent_zeromq import zmq
..yada yada yada...
self.subscriber = ctx.socket(zmq.SUB)
self.subscriber.setsockopt(zmq.SUBSCRIBE, '')
self.subscriber.connect('%s:%d' % (address, port + 1))
self.subscriber.linger = 0
卵黄:
gevent-zeromq - 0.2.5 - active
gevent - 1.0b4 - active
greenlet - 0.4.0 - active