A la découverte de Twisted

Le
pas de nom
Bonjour,

J'ai découvert Python récemment et encore plus récemment le module Twisted.

J'ai un petit problème avec le reacteur de Twisted et j'aimerais bien
comprendre pour quel raison mon programme fige.

Voici le code qui devrait boucler ad eternam :

from twisted.internet import reactor
from twisted.internet import task

class reactorProb(object):
def __init__(self):
self.count = 5
self._callback = task.LoopingCall(self.Heartbeat)
self._callback.start(1, now = False)
def Heartbeat(self):
print "Top"
self.count -= 1
if (self.count == 0):
print "Exit"
self._callback.stop()
del self._callback
reactor.stop()

while (True):
rp = reactorProb()
print "Enter into reactor.run()"
reactor.run()
print "Leave from reactor.run()"


J'obtiens ceci :

Enter into reactor.run()
Top
Top
Top
Top
Top
Exit
Leave from reactor.run()
Enter into reactor.run()
Top
Top
Top
Top
Top
Exit

Donc je démarre une première fois le réacteur, je l'arrête puis je
redémarre et je fige au lieu de l'arrêter le réacteur.

Quelqu'un pourrait m'expliquer le pourquoi du comment ?

D'avance merci

smu
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
pas de nom
Le #649047
Bonjour,

J'ai découvert Python récemment et encore plus récemment le module Twisted.

J'ai un petit problème avec le reacteur de Twisted et j'aimerais bien
comprendre pour quel raison mon programme fige.

Voici le code qui devrait boucler ad eternam :

from twisted.internet import reactor
from twisted.internet import task

class reactorProb(object):
def __init__(self):
self.count = 5
self._callback = task.LoopingCall(self.Heartbeat)
self._callback.start(1, now = False)
def Heartbeat(self):
print "Top"
self.count -= 1
if (self.count == 0):
print "Exit"
self._callback.stop()
del self._callback
reactor.stop()

while (True):
rp = reactorProb()
print "Enter into reactor.run()"
reactor.run()
print "Leave from reactor.run()"


J'obtiens ceci :

Enter into reactor.run()
Top
Top
Top
Top
Top
Exit
Leave from reactor.run()
Enter into reactor.run()
Top
Top
Top
Top
Top
Exit

Donc je démarre une première fois le réacteur, je l'arrête puis je
redémarre et je fige au lieu de l'arrêter le réacteur.


Il faut lire :

Donc je démarre une première fois le réacteur, je l'arrête puis je
redémarre et il fige au lieu de l'arrêter le réacteur.



Quelqu'un pourrait m'expliquer le pourquoi du comment ?

D'avance merci

smu


smu

pas de nom
Le #649044
from twisted.internet import reactor
from twisted.internet import task

class reactorProb(object):
def __init__(self):
self.count = 5
self._callback = task.LoopingCall(self.Heartbeat)
self._callback.start(1, now = False)
def Heartbeat(self):
print "Top"
self.count -= 1
if (self.count == 0):
print "Exit"
self._callback.stop()
del self._callback
reactor.stop()

while (True):
rp = reactorProb()
print "Enter into reactor.run()"
reactor.run()
print "Leave from reactor.run()"



smu



Bon, il semblerait que l'on ne puisse appeler les méthodes start() et
stop() qu'une seule fois.

Si quelqu'un pouvait m'indiquer une autre méthode pour arriver au
résultat en utilisant twisted, cela m'aiderais bien.

smu


Bruno Desthuilliers
Le #649043
from twisted.internet import reactor
from twisted.internet import task

(snip)



Bon, il semblerait que l'on ne puisse appeler les méthodes start() et
stop() qu'une seule fois.

Si quelqu'un pouvait m'indiquer une autre méthode pour arriver au
résultat en utilisant twisted, cela m'aiderais bien.


Honnêtement, je pense que tu aura de meilleures réponses sur la ml de
twisted.



Amaury Forgeot d'Arc
Le #651658
Bonsoir,
J'ai un petit problème avec le reacteur de Twisted et j'aimerais bien
comprendre pour quel raison mon programme fige.

Voici le code qui devrait boucler ad eternam :

from twisted.internet import reactor
from twisted.internet import task

class reactorProb(object):
def __init__(self):
self.count = 5
self._callback = task.LoopingCall(self.Heartbeat)
self._callback.start(1, now = False)
def Heartbeat(self):
print "Top"
self.count -= 1
if (self.count == 0):
print "Exit"
self._callback.stop()
del self._callback
reactor.stop()

while (True):
rp = reactorProb()
print "Enter into reactor.run()"
reactor.run()
print "Leave from reactor.run()"


J'obtiens ceci :

Enter into reactor.run()
Top
Top
Top
Top
Top
Exit
Leave from reactor.run()
Enter into reactor.run()
Top
Top
Top
Top
Top
Exit

Donc je démarre une première fois le réacteur, je l'arrête puis je
redémarre et je fige au lieu de l'arrêter le réacteur.

Quelqu'un pourrait m'expliquer le pourquoi du comment ?


Comme il a été dit, un réacteur ne fonctionne qu'une seule fois
(peut-être faudrait-il l'appeler 'fusée', ou 'allumette').

Souvent en twisted, une tâche que l'on attend crée un Deferred, et le
déclenche quand elle a fini. Par chance (!) c'est ce que fait un
LoopingCall ! Pour reprendre ton exemple:

from twisted.internet import reactor
from twisted.internet import task

class reactorProb(object):
def __init__(self):
self.count = 5
self._callback = task.LoopingCall(self.Heartbeat)
self._callback.start(1, now = False)
def Heartbeat(self):
print "Top"
self.count -= 1
if self.count == 0:
print "Exit"
self._callback.stop()
del self._callback

def startProb(result=None):
print "starting task"
rp = reactorProb()
rp._callback.deferred.addCallback(startProb)

startProb()
reactor.run()



C'est l'appel à self._callback.stop() qui déclenche le deferred. Et
comme on a attaché la bonne callback... on recommence! Sans toucher au
réacteur.



Moi je l'aurais sans doute écrit comme ceci:

def reactorProb():
count = [5]
def heartbeat():
print "Top"
count[0] -= 1
if count[0] == 0:
print "Exit"
loop.stop()
loop = task.LoopingCall(heartbeat)
loop.start(1, nowúlse)
return loop.deferred

def startProb(result=None):
print "starting task"
deferred = reactorProb()
deferred.addCallback(startProb)

startProb()
reactor.run()

--
Amaury Forgeot d'Arc

Publicité
Poster une réponse
Anonyme