我已从gevent 13.x升级到1.0b4。
我有故障转移代码,通过每5秒发送一次“HUGZ”来检查连接是否存活。如果HUGZ未能到达,则建立到不同位置的替代连接。此故障转移机制已停止工作,因为Timeout行为已更改。
我使用with Timeout
制作了一些测试代码,并且它按预期工作,
但是在我的应用程序的上下文中,完全相同的代码不再起作用。以前使用的故障转移代码。
我正在使用gevent-zeromq来收集with TimeOut
块中的消息,但是with TimeOut
块,并且永远不会“超时”并继续执行,因此恢复代码不会被执行。 / p>
什么可能导致超时机制无法正常工作? 以前工作的超时代码不再起作用。
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
答案 0 :(得分: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