Je veux exécuter une fonction en Python de manière répétée toutes les 60 secondes pour toujours (comme un NSTimer en Objective C ou setTimeout en JS). Ce code s'exécute comme un démon et revient à appeler le script python script toutes les minutes à l'aide d'un cron, mais sans que l'utilisateur n'ait à le configurer.
En cette question sur un cron implémenté en Python la solution semble en fait se résumer à sleep() pendant x secondes. Je n'ai pas besoin d'une fonctionnalité aussi avancée, alors peut-être que quelque chose comme ceci fonctionnerait
while True:
# Code executed here
time.sleep(60)
Ce code pose-t-il des problèmes prévisibles ?
155 votes
Un point pédant, mais qui peut être critique, votre code ci-dessus ne s'exécute pas toutes les 60 secondes, il met un écart de 60 secondes entre les exécutions. Il ne s'exécute toutes les 60 secondes que si le code exécuté ne prend pas de temps du tout.
0 votes
Duplicata : stackoverflow.com/questions/373335/
7 votes
Également
time.sleep(60)
peut revenir plus tôt et plus tard9 votes
Je m'interroge encore : Ce code pose-t-il des problèmes prévisibles ?
9 votes
Le "problème prévisible" est que vous ne pouvez pas vous attendre à 60 itérations par heure en utilisant simplement time.sleep(60). Ainsi, si vous ajoutez un élément par itération et conservez une liste de longueur déterminée, la moyenne de cette liste ne représentera pas une "période" cohérente ; des fonctions telles que la "moyenne mobile" peuvent donc se référer à des points de données trop anciens, ce qui faussera votre indication.
0 votes
Véase Planification en Python pour un exemple tout simple.
12 votes
@Banana Oui, vous pouvez vous attendre à des problèmes causés par le fait que votre script n'est pas exécuté EXACTEMENT toutes les 60 secondes. Par exemple. J'ai commencé à faire quelque chose comme ça pour diviser les flux vidéo et les télécharger, et j'ai fini par obtenir des flux 5-10~ secondes plus longs parce que la file d'attente des médias est en mémoire tampon pendant que je traite les données à l'intérieur de la boucle. Cela dépend de vos données. Si la fonction est une sorte de chien de garde simple qui vous avertit, par exemple, lorsque votre disque est plein, vous ne devriez avoir aucun problème avec cela. Si vous vérifiez les alertes d'une centrale nucléaire, vous risquez de vous retrouver avec une ville complètement détruite.
2 votes
Il faut absolument préciser le terme "meilleur" : Avez-vous réellement besoin d'une exécution précise toutes les x secondes, avec une précision de l'ordre de la milliseconde (< 50 ms) ? (ce que fait cron, ou la réponse de @DaveRove), ou environ toutes les x secondes ? (Vous dites que votre code est censé être "efficacement comme cron" (mais s'agit-il de la précision ?)
0 votes
Ainsi, s'ils suivaient le temps d'exécution de leur extrait de code, puis le soustrayaient des 60 secondes de chaque itération et ne dormaient que 60-code_time, y aurait-il une raison d'utiliser d'autres bibliothèques ?