Exécuter une fonction Toutes les X minutes-Python
J'utilise Python et PyGTK. Je suis intéressé par l'exécution d'une certaine fonction, qui obtient des données d'un port série et les sauve, toutes les quelques minutes.
actuellement, j'utilise la fonction sleep () dans la bibliothèque de temps. Afin de pouvoir effectuer le traitement, j'ai mis en place mon système comme ceci:
import time
waittime = 300 # 5 minutes
while(1):
time1 = time.time()
readserial() # Read data from serial port
processing() # Do stuff with serial data, including dumping it to a file
time2 = time.time()
processingtime = time2 - time1
sleeptime = waittime - processingtime
time.sleep(sleeptime)
cette configuration me permet d'avoir des intervalles de 5 minutes entre la lecture des données du port série. Mon problème est que je voudrais pouvoir avoir ma fonction readserial() mettez en pause ce qui se passe toutes les 5 minutes et soyez en mesure de faire des choses tout le temps au lieu d'utiliser le temps.sleep() de la fonction.
des suggestions sur la façon de résoudre ce problème? Le Multithreading? Les interruptions? Gardez à l'esprit que j'utilise python.
Merci.
4 réponses
N'utilisez pas une telle boucle avec sleep, elle empêchera gtk de traiter les événements UI, utilisez plutôt GTK timer Par exemple
def my_timer(*args):
return True# do ur work here, but not for long
gtk.timeout_add(60*1000, my_timer) # call every min
C'est exactement comme ma réponse ici
Si le temps n'est pas critique pour être exact, pour le dixième de seconde, utiliser
glib.timeout_add_seconds(60, ..)
autrement comme ci-dessus.
timeout_add_secondes permet au système d'aligner les temps d'arrêt sur d'autres événements, en réduisant à long terme les temps d'arrêt CPU (surtout si le temps d'arrêt est de nouveau) et économiser de l'énergie pour la planète(!)
gtk.timeout_add semble être déprécié, vous devez donc utiliser
def my_timer(*args):
# Do your work here
return True
gobject.timeout_add( 60*1000, my_timer )