2010-08-08 9 views
26

Je veux savoir comment appeler une fonction après un certain temps. J'ai essayé time.sleep() mais cela interrompt tout le script. Je veux que le script continue, mais après ??? secs appeler une fonction et exécuter l'autre script en même tempsRetards de temps Python

Répondre

47

Jetez un oeil à threading.Timer. Il exécute votre fonction dans un nouveau thread.

from threading import Timer 

def hello(): 
    print "hello, world" 

t = Timer(30.0, hello) 
t.start() # after 30 seconds, "hello, world" will be printed 
+0

multithreading ... hmm, cela semble familier. N'est-ce pas là qu'il y a plus d'un processus? Eh bien de toute façon qui semble juste. Si j'utilise t.start() plus d'une fois, continue-t-il, me donne-t-il une erreur ou redémarre-t-il le minuteur? – drnessie

+0

@drnessie: "N'est-ce pas qu'il y a plus d'un processus?" Non - c'est quand vous avez plus d'un thread. "si j'utilise t.start() plus d'une fois, est-ce que ça continue, donnez-moi une erreur ou redémarrez la minuterie?" - Vous obtenez une erreur 'RuntimeError: thread déjà démarré' que vous pouvez facilement vérifier par vous-même en dupliquant la dernière ligne du code source ci-dessus et en l'exécutant. –

+0

Y at-il un moyen de se débarrasser de l'erreur, en dehors de l'arrêt puis redémarrage de la minuterie? – drnessie

3

Si vous voulez une fonction à appeler après un certain temps et ne pas arrêter votre script que vous traitez intrinsèquement avec le code fileté. Si vous voulez définir une fonction à appeler et ne pas vous en préoccuper, vous devez soit utiliser explicitement le multi-threading, comme par exemple la réponse d'em Mark Byers, soit utiliser un framework de codage avec une boucle principale qui s'occupe de la distribution des fonctions. vous - comme tordu, qt, gtk, pyglet, et tant d'autres. N'importe lequel de ces éléments nécessiterait que vous réécriviez votre code afin qu'il fonctionne à partir de la boucle principale de ce cadre. C'est soit cela, soit écrire une boucle principale à partir de la vérification de l'événement vous-même sur votre code - Dans l'ensemble, si vous ne voulez que des appels à une seule fonction, threading.Timer est le moyen de le faire. Si vous voulez utiliser ces appels chronométrés pour boucler le programme comme cela est habituellement fait avec setTimeout de javascript, vous feriez mieux de sélectionner l'un des cadres de codage que j'ai énumérés ci-dessus et de refactoriser votre code pour en profiter.

+0

Ce code ne fonctionne pas threading.Timer (30,0, self.timestart (fenêtre)) .start() Il appelle self.timestart, donnant la fenêtre arg, mais il fait immédiatement, et non après 30Secs Would J'ai demandé à Mark, mais je l'ai assez dérangé, et vous savez aussi ce que vous en dites :) – drnessie

-4
import threading 

def time_demo(): 
    threading.Timer(5.0, time_demo()).start() 

print 'Hello this is time demo function' 
time_demo() 
+1

Votre code se bloque parce que vous avez une récursion infinie, vous devez enlever les parenthèses quand vous passez dans time_demo parce que vous devrait passer dans un pointeur de fonction. – cujo

Questions connexes