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.

11
demandé sur mouche 2009-06-27 14:28:42

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
23
répondu Anurag Uniyal 2012-02-23 15:15:33

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(!)

10
répondu u0b34a0f6ae 2017-05-23 12:25:02

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 )
4
répondu williampli 2011-01-10 20:11:00

essaie:

import wx
wx.CallLater(1000, my_timer)
1
répondu Leon 2013-01-22 22:02:39