PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.python > A la découverte de Twisted
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
A la découverte de Twisted

Réponse
 
LinkBack Outils de la discussion
Vieux 27/09/2007, 09h29   #1
pas de nom
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut A la découverte de Twisted

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
  Réponse avec citation
Vieux 27/09/2007, 11h19   #2
pas de nom
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> 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
  Réponse avec citation
Vieux 27/09/2007, 11h19   #3
pas de nom
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> 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
  Réponse avec citation
Vieux 27/09/2007, 14h07   #4
pas de nom
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> pas de nom a écrit :
>> 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
  Réponse avec citation
Vieux 27/09/2007, 14h07   #5
pas de nom
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> pas de nom a écrit :
>> 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
  Réponse avec citation
Vieux 27/09/2007, 14h47   #6
Bruno Desthuilliers
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> pas de nom a écrit :
>> pas de nom a écrit :
>>> 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.

  Réponse avec citation
Vieux 27/09/2007, 14h47   #7
Bruno Desthuilliers
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

pas de nom a écrit :
> pas de nom a écrit :
>> pas de nom a écrit :
>>> 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.

  Réponse avec citation
Vieux 27/09/2007, 21h00   #8
Amaury Forgeot d'Arc
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

Bonsoir,
pas de nom a écrit :
> 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=False)
return loop.deferred

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

startProb()
reactor.run()

--
Amaury Forgeot d'Arc
  Réponse avec citation
Vieux 27/09/2007, 21h00   #9
Amaury Forgeot d'Arc
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: A la découverte de Twisted

Bonsoir,
pas de nom a écrit :
> 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=False)
return loop.deferred

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

startProb()
reactor.run()

--
Amaury Forgeot d'Arc
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 05h18.


Édité par : vBulletin® version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières ©2000-2008
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 2,91011 seconds with 17 queries