Comment faire pour exécuter une fonction asynchrone toutes les 60 secondes en Python?
Je veux exécuter une fonction toutes les 60 secondes sur Python, mais je ne veux pas être bloqué en attendant.
Comment puis-je le faire de manière asynchrone?
import threading
import time
def f():
print("hello world")
threading.Timer(3, f).start()
if __name__ == '__main__':
f()
time.sleep(20)
Avec ce code, la fonction f est exécuté toutes les 3 secondes dans le temps de 20 secondes.temps.
À la fin, il donne une erreur et je pense que c'est parce que l'enfilage.la minuterie n'a pas été annulée.
Comment puis-je l'annuler?
Merci d'avance!
- Votre programme est appelé à disparaître après la ponte du premier Temporisateur.
- Pour annuler la Minuterie vous avez besoin de garder une référence à quelque part, et appeler sa
cancel
méthode. - Notez que toutes les solutions posté jusqu'à présent souffrent d'une (petite) cumulative de l'accumulation de l'erreur. C'est, plutôt que de calculer suivant la durée du sommeil d'après une heure de départ, ils ont simplement dormir "un autre des années 60". Ce ne sera jamais le sommeil de moins de 60 ans, et l'habitude de dormir un peu plus de 60 ans. Ce n'est pas toujours un problème, mais si vous voulez dormir exactement 1440 fois dans une journée, assurez-vous de compenser cette erreur.
- ce n'est pas un problème dans ma solution. merci pour cette remarque!
- connexes:
setTimeout()
,setInterval()
en Python. Exemples de tkinter, tordu, gtk
Vous devez vous connecter pour publier un commentaire.
Vous pouvez essayer de l'enfilage.Classe Timer: http://docs.python.org/library/threading.html#timer-objects.
.start()
la Minuterie, j'ai édité dans.sys.exit(0)
aller dans mon code? Dans le corps de la fonction, ou après l'appel de la fonction – la lignef()
dans ce cas?threading.Timer(60, f).start()
vivre dans la fonctionf()
ou est-il en quelque sorte extérieure à celle-ci? Semble que vous êtes dans une de manière, de manière récursive, à l'appel def()
, ce serait très mauvais si le délai était plus petit, comme à chaque seconde ou 20ms ou quelque chose.Cela dépend de ce que vous voulez vraiment faire dans le temps de le dire. Les Threads sont le plus général et le moins préféré façon de le faire, vous devez être conscient des problèmes avec filetage, lorsque vous l'utilisez: pas tous (non-Python) code permet l'accès à partir de plusieurs threads simultanément, la communication entre les threads doit être thread-safe structures de données comme
Queue.Queue
, vous ne serez pas en mesure d'interrompre le fil de l'extérieur, et en terminant le programme tandis que le thread est toujours en cours d'exécution peut conduire à un pendu interprète ou fausses retraçage.Souvent, il y a un moyen plus facile. Si vous êtes en train de faire cela dans un programme graphique, utilisation de l'interface graphique de la bibliothèque de l'horloge ou de l'événement de la fonctionnalité. Toutes les Interfaces graphiques ont cette. De même, si vous utilisez un autre système d'événements, comme des Tordus ou un autre serveur-modèle de processus, vous devriez être en mesure de crochet dans la boucle principale pour l'obliger à appeler votre fonction régulièrement. Le non-threading approches ne cause votre programme pour être bloqué tant que la fonction est en cours, mais pas entre les functioncalls.
La façon la plus simple est de créer un thread d'arrière-plan qui s'exécute quelque chose de toutes les 60 secondes. Une implémentation simple est:
Évidemment, si le "faire quelque chose" prend beaucoup de temps, vous aurez besoin de vous accueillir dans votre sommeil déclaration. Mais ce qui constitue une bonne approximation.
__init__
méthode est superflu 🙂time.time()
oudatetime.now()
), vérifier le temps au début de l'exécution de la tâche, ajouter 60 secondes pour obtenir le temps pour le prochain tir, puis vérifier à nouveau, à la fin, et déduisons que le prochain tir de temps pour obtenir votre temps de sommeil.J'ai googlé autour et a trouvé le Python circuits Cadre, ce qui permet d'attendre
pour un événement particulier.
La
.callEvent(self, event, *channels)
méthode de circuits contient un incendie et de suspension jusqu'à la réponse de la fonctionnalité, de la documentation dit:J'espère que vous trouverez ce utile que je fais 🙂
./ce qui concerne
Si vous voulez appeler la méthode "de l'horloge" (par exemple toutes les heures sur l'heure), vous pouvez intégrer l'idée suivante avec n'importe quel mécanisme de threading à vous de choisir:
Je pense que la bonne façon de courir un fil à plusieurs reprises est la suivante:
Avec ce code, la fonction f est exécuté toutes les 3 secondes dans le délai de 10 secondes de temps.sleep(10). À la fin de l'exécution du thread est annulée.
Pourquoi ne pas vous créer un thread dédié, dans lequel vous mettez un simple couchage boucle: