Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

[Twisted]: Lancer twisted reactor dans d'un thread séparé.

+2 votes

Quand je lance le réacteur de Twisted dans un thread séparé, mon code Twisted il n'est jamais exécuté.

Pour résoudre ce problème j'ai du ajouté un sleep(), c'est moche je le sais...

def _reactor_thread(self):
    if not self.reactor.running:
    self.reactor.run(installSignalHandlers=0)

def _start_thread( self ):
    self.client_thread = Thread( target=self._reactor_thread,
                                 name="mine" )
    self.client_thread.setDaemon(True)
    self.client_thread.start()
    from time import sleep
    sleep( 0.5 )

Quelle est la meilleur façon de le faire proprement?

demandé 2-Fev-2015 par akadi (324 points)

Je vais tester de mon côté, mais en attendant, es-tu certain de vouloir lancer ton code twisted dans un thread séparé ? Généralement on fait plutôt l'inverse : twisted en boucle principal, et l'autre code dans un thread séparé. Quel est ton use case ?

J'ai oublié, j'ai posé la question sur Twistedmatrix, j'ai eu deux réponses, mais ça m'a pas trop aidé.

Oui je veux bien lancer le reactor Twisted dans un thread séparé, en fait, on est 100% synchrone, et on doit interroger un serveur externe Freeswitch via une la lib Evensocket, cette dernière est 100% basée sur Twisted.

Si je ne lance pas le reactor dans un thread séparé, le thread principal va le lancer (le reactor ) et ne rend jamais la main pour le reste de l’exécution.

1 Réponse

0 votes
 
Meilleure réponse

Oui je veux bien lancer le reactor Twisted dans un thread séparé, en
fait, on est 100% synchrone, et on doit interroger un serveur externe
Freeswitch via une la lib Evensocket, cette dernière est 100% basée
sur Twisted.

Dans ce cas le plus simple pour toi est d'utiliser crochet. C'est une lib qui permet d'utiliser des bouts de code twisted dans une application synchrone. Ca va se démerder pour lancer le reactor dans un thread pour toi, mettre un timeout, récupérer le résultat et te permettre d'utiliser tout ça comme si c'était une lib blocante dans ton code bloquant.

répondu 6-Fev-2015 par Sam (5,000 points)
sélectionné 6-Fev-2015 par akadi
...