Führen Sie eine Funktion alle X Minuten - Python
Frage
Ich bin mit Python und PyGTK. Ich habe Interesse an eine bestimmte Funktion ausgeführt wird, die Daten von einem seriellen Anschluss bekommt und speichert es, alle paar Minuten.
Derzeit bin ich mit dem Schlaf () Funktion in der Zeitbibliothek. Um in der Lage zu sein, die Verarbeitung zu tun, ich habe mein System wie dies ein:
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)
Dieses Setup ermöglicht es mir, von der seriellen Schnittstelle Intervallen von 5 Minuten zwischen Lesen von Daten zu haben. Mein Problem ist, dass ich möchte in der Lage sein, meine Readserial () Funktion Pause zu haben, was auch immer auf alle 5 Minuten wird und in der Lage sein, die Dinge zu tun, die ganze Zeit, anstatt die time.sleep () Funktion zu verwenden.
Alle Vorschläge, wie dieses Problem zu lösen? Multithreading? Interrupts? Bitte beachten Sie, dass ich Python bin mit.
Danke.
Lösung
nicht solche Schleife mit Schlaf Verwenden Sie, wird es gtk aus der Verarbeitung keine UI Ereignisse blockieren, verwenden Sie stattdessen gtk Timer z.
def my_timer(*args):
return True# do ur work here, but not for long
gtk.timeout_add(60*1000, my_timer) # call every min
Andere Tipps
Das ist genau wie meine Antwort hier
Wenn die Zeit ist nicht kritisch, genau auf die Zehntelsekunde zu sein, verwenden Sie
glib.timeout_add_seconds(60, ..)
sonst wie oben.
timeout_add_seconds erlaubt es dem System-Timeouts zu anderen Veranstaltungen auszurichten, auf lange Sicht reduziert CPU Wakeups (vor allem, wenn das Timeout reocurring) und speichert Energie für den Planeten (!)
gtk.timeout_add erscheint veraltet zu sein, so sollten Sie verwenden
def my_timer(*args):
# Do your work here
return True
gobject.timeout_add( 60*1000, my_timer )
Versuch:
import wx
wx.CallLater(1000, my_timer)