1

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 
4

1 に答える 1

0

変更:

with Timeout(2, False):
    node_message = NodeMessage.recv(active_socket)

に:

class MessageContext(object):
    node_message = None

messageContext = MessageContext()  //shared memmory between greenlets

...

def get_next_message(active_socket)
    messageContext.node_message = NodeMessage.recv(active_socket)

with Timeout(2, False):
     ..putting the actual receving of a message in its own greenlet
     ..makes TimeOut failover/Timeout work again..

    gevent.spawn(get_next_message, active_socket).job()

node_message = messageContext.node_message
于 2012-10-16T13:59:00.640 に答える