Подтвердить что ты не робот

Запуск функции каждые X минут - Python

Я использую 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.

Спасибо.

4b9b3361

Ответ 1

Не используйте такой цикл со сном, он блокирует 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

Ответ 2

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

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

glib.timeout_add_seconds(60, ..)

else, как указано выше.

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

Ответ 3

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

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

gobject.timeout_add( 60*1000, my_timer )

Ответ 4

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

import wx
wx.CallLater(1000, my_timer)