OVH Cloud OVH Cloud

Classe Threading, utilisation de Timer( )

1 réponse
Avatar
alain.cartron
Salut a tous,

Un petit soucis si qq'un peut me donner son avis,
j'ai ecrit ce code pour utiliser le timer :

import threading
t=''
def func():
print "ICI"
#t.cancel()
t = threading.Timer(5.0, func)
nb=10
i=0
for i in range(nb):
t.start()
t.cancel() # quel est l'effet de cette fonction ??

A l'exec le timer marche une fois il affihe ICI au bout de 5s, enter
et ca stoppe , et ensuite si je relance j'ai ce msg d'erreur, je ne
sais pas comment en sortir ?
En fait pour ne pas charger la CPU je veux boucler et executer un SQL
tout les x secondes definies dans le timer.


D:\Scripts\Essai_PROD\Essai\TESSI>D:\Scripts\Timer.py
Traceback (most recent call last):
File "D:\Scripts\Timer.py", line 10, in ?
t.start()
File "C:\Python23\lib\threading.py", line 404, in start
assert not self.__started, "thread already started"
AssertionError: thread already started

Si je fais :

>>> t.isAlive( )
False
>>> threading.currentThread()
<_MainThread(MainThread, started)>
>>> threading.activeCount()
2

Que me faut-il faire pour pouvoit boucler x fois avec le timer, et
relancer le script sans qavoir ce pu... de message d'erreur ??

Merci so much

1 réponse

Avatar
Laurent Pointal
Que me faut-il faire pour pouvoit boucler x fois avec le timer, et
relancer le script sans qavoir ce pu... de message d'erreur ??


Si tu regardes la doc, Timer n'est qu'un Thread dont le démarrage est
mis en attente quelques temps, après c'est un fonctionnement normal de
thread (ie. tu ne peux pas le démarrer plusieurs fois).

Solution:

import time

def func():
while True:
print "ICI"
time.sleep(5.0)

On peut bien sûr faire un peu plus évolué sur la condition de boucle...


Ou encore créer une classe du genre:
class LoopOver :
def __init__(self,fct,period) :
self.fct = fct
self.period = period
def __call__(self,*args,**kargs) :
while True :
self.fct(*args,**kargs)
time.sleep(self.period)

t = threading.Timer(5.0, LoopOver(func,5.0))

&Co...

A+

Laurent.