Запускать функцию каждые X минут - Python - PullRequest
12 голосов
/ 27 июня 2009

Я использую Python и PyGTK. Меня интересует запуск определенной функции, которая получает данные с последовательного порта и сохраняет их каждые несколько минут.

В настоящее время я использую функцию sleep () в библиотеке времени. Чтобы иметь возможность выполнять обработку, я настроил мою систему следующим образом:

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.

Спасибо.

Ответы [ 4 ]

24 голосов
/ 27 июня 2009

Не используйте такой цикл со сном, он заблокирует gtk от обработки любых событий пользовательского интерфейса, вместо этого используйте таймер gtk, например,

def my_timer(*args):
    return True# do ur work here, but not for long

gtk.timeout_add(60*1000, my_timer) # call every min
10 голосов
/ 21 августа 2009

Это в точности как мой ответ здесь

Если время не является критическим с точностью до десятой доли секунды, используйте

glib.timeout_add_seconds(60, ..)

иначе как выше.

timeout_add_seconds позволяет системе выравнивать тайм-ауты с другими событиями, в конечном итоге сокращая количество пробуждений ЦП (особенно, если тайм-аут повторяется) и экономит энергию для планеты (!)

4 голосов
/ 10 января 2011

gtk.timeout_add устарела, поэтому вы должны использовать

def my_timer(*args):
    # Do your work here
    return True

gobject.timeout_add( 60*1000, my_timer )
1 голос
/ 23 января 2013

попробовать:

import wx
wx.CallLater(1000, my_timer)
...