2012-10-16 3 views
1

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 

Répondre

0

changement:

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 
+0

pourquoi ne 'recv()' rendement avant, mais pas maintenant? –

+0

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