2016-12-06 2 views
0

Je rencontre des problèmes avec twisted.internet.reactor Tous mes clients ont des environnements complètement identiques, mais seulement une certaine expérience de ce problème:réacteur Twisted ne pas appeler des fonctions de fil correctement

Ils correctement connectTCP au serveur via ws et premier échange de plusieurs messages. Environ une minute, ils doivent envoyer un message au serveur via la méthode

def execute(self, message, callback=None): 
    print(">>>", message, flush=True) 
    reactor.callFromThread(self._client_protocol_instance.send, message, callback) 

self._client_protocol_instance.send est défini comme suit:

def send(self, command, callback): 
    print("send", command, callback, flush=True) 
    timestamp = int(time() * 1000000) 
    msg = (command.strip() + " --timestamp:" + str(timestamp)) 
    if _self._debug: 
     _self._commands[str(timestamp)] = msg 
    if callback is not None: 
     _self._callbacks[str(timestamp)] = callback 
    payload = msg.encode() 
    _self._status_controller.set_state(payload) 
    self.sendMessage(payload) 

Première print montre en stdout, mais seconde ne fonctionne pas. Je suppose que send n'est pas exécuté. Après reactor.run(), c'est la seule référence au reactor dans le programme entier.

Killing le processus du client après que cela se produit est immédiatement détecté par le serveur, de sorte que la connexion était encore en vie à ce moment-là.

Ce qui pourrait être à l'origine de cela?

Répondre

0

J'ai trouvé la solution, le problème résidait dans le fait que la tâche précédente ne se terminait pas parfois au moment où elle essayait d'envoyer le message. Je l'ai résolu en déplaçant toute la logique de gestion de la réponse cpu-lourde dans les threads pour libérer le réacteur pour d'autres messages.