J'ai effectué une mise à niveau de gevent 13.x à 1.0b4.gevent 'with Timeout' a cessé de fonctionner
J'ai un code de basculement qui vérifie si une connexion est vivante en envoyant "HUGZ" toutes les 5 secondes. Si les HUGZ n'arrivent pas, une connexion alternative est établie. Ce mécanisme de basculement a cessé de fonctionner car le comportement du délai d'attente a changé.
J'ai fait du code de test avec un with Timeout
et le et cela fonctionne comme prévu, MAIS le même code exact ne fonctionne plus dans mon contexte de mon application. Le code de basculement utilisé pour travailler avant. J'utilise gevent-zeromq pour recv messages dans un bloc with TimeOut
, mais les blocs with TimeOut
, et jamais 'times out' et continue l'exécution, afin que le code de récupération ne soit pas exécuté. Qu'est-ce qui pourrait empêcher le mécanisme Timeout de fonctionner?
Le code Timeout précédemment utilisé ne fonctionne plus.
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?
La méthode de recv:
@classmethod
def recv(cls, socket):
"""Reads name-value message from socket"""
while True:
message = socket.recv()
if message:
return cls.from_message(message)
La douille est une initialisation dans un objet de connexion dont j'ai quelques-uns:
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
jaune:
gevent-zeromq - 0.2.5 - active
gevent - 1.0b4 - active
greenlet - 0.4.0 - active
pourquoi ne 'recv()' rendement avant, mais pas maintenant? –
Je suppose que le 'recv()' a donné sinon mon application entière bloquerait et cela ne s'est pas produit. J'ai regardé le code TimeOut dans Gevent et vu que le code n'a pas changé depuis longtemps. Donc, je suppose qu'il a quelque chose à faire avec zmq/gevent_zmq. – Stephan