Запускайте функцию каждые X минут - Python
Вопрос
Я использую Python и PyGTK.Я заинтересован в запуске определенной функции, которая получает данные с последовательного порта и сохраняет их каждые несколько минут.
В настоящее время я использую функцию sleep() в библиотеке time.Чтобы иметь возможность выполнять обработку, моя система настроена следующим образом:
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)
Эта настройка позволяет мне иметь 5-минутные интервалы между считыванием данных с последовательного порта.Моя проблема в том, что я хотел бы, чтобы моя функция readserial () приостанавливала все происходящее каждые 5 минут и могла делать что-то постоянно, вместо того чтобы использовать функцию time.sleep().
Есть какие-нибудь предложения о том, как решить эту проблему?Многопоточность?Прерывает?Пожалуйста, имейте в виду, что я использую python.
Спасибо.
Решение
Не используйте такой цикл со сном, это заблокирует gtk обработку любых событий пользовательского интерфейса, вместо этого используйте gtk timer, например
def my_timer(*args):
return True# do ur work here, but not for long
gtk.timeout_add(60*1000, my_timer) # call every min
Другие советы
Это в точности похоже на мой ответ здесь
Если время не является критичным с точностью до десятой доли секунды, используйте
glib.timeout_add_seconds(60, ..)
остальное, как указано выше.
тайм - аут_адд_секунды позволяет системе согласовывать тайм-ауты с другими событиями, в долгосрочной перспективе сокращая время пробуждения процессора (особенно если тайм-аут повторяется) и экономьте энергию для планеты(!)
gtk.timeout_add, похоже, устарел, поэтому вам следует использовать
def my_timer(*args):
# Do your work here
return True
gobject.timeout_add( 60*1000, my_timer )
попробуй:
import wx
wx.CallLater(1000, my_timer)