Timer (scheduler) в python

 
0
 
Python
ava
brainstream | 05.12.2010, 17:26
Перерыл все интернеты, ничего хорошего не нашёл.
Нужно выполнять функцию каждые n секунд. При этом рабочий поток должен работать и функция должна выполняться в рабочем потоке.
Если использовать PyQt4, то можно сделать так

self.__timer = QTimer()
self.connect(self.__timer, SIGNAL("timeout()"), self.timerEvent)
self.__timer.start(1000)

В стандартной библиотеке python есть класс treading.Timer, но эта штука срабатывает только один раз. Я попробовал вызывать Timer.run из обработчика, так у меня через 3 минуты 31 секунду таймер сдох с вываливанием эксцепшена (что-то о максимальной глубине чего-то там).
Вопрос, есть ли человеческий тамер в python?
Kommentare (10)
ava
Daevaorn | 05.12.2010, 17:45 #
Цитата (Cheloveck @ 5.12.2010, 18:26 findReferencedText)
Перерыл все интернеты, ничего хорошего не нашёл.

http://docs.python.org/library/sched.html
ava
brainstream | 05.12.2010, 17:49 #
Цитата (Daevaorn @ 5.12.2010, 17:45 findReferencedText)
http://docs.python.org/library/sched.html

Я его пробовал, он поток вешает (останавливает)
ava
Pfailed | 05.12.2010, 21:12 #
signal.alarm() ?
ava
brainstream | 05.12.2010, 22:28 #
Цитата (Pfailed @ 5.12.2010, 21:12 findReferencedText)
signal.alarm() ?

Неа.
Цитата


Any previously scheduled alarm is canceled (only one alarm can be scheduled at any time).


http://docs.python.org/library/signal.html#signal.alarm
Мне может понадобится несколько таймеров.
ava
senkler | 10.12.2010, 19:25 #
Привет, нашел такой пример в сети . Надеюсь тебе поможет !


import threading
import time

class ClockThread(threading.Thread):
def __init__(self.interval):
threading.Thread.__init__(self)
self.daemon = True
self.interval = interval
def run(self):
while True:
print("Time : %s" % time.ctime())
time.sleep(self.interval)

t = ClockThread(15)
t.start()

ava
brainstream | 10.12.2010, 19:50 #
Цитата (senkler @ 10.12.2010, 19:25 findReferencedText)
Надеюсь тебе поможет !


Цитата (Cheloveck @ 5.12.2010, 17:26 findReferencedText)
При этом рабочий поток должен работать и функция должна выполняться в рабочем потоке.

:nea

später ergänzt:
Я, конечно, понимаю, что можно устроить свою очередь сообщений и читать её из рабочего потока, в то время, когда таймер будет работать у себя. Но, неужели нет в python простого таймера, типа виндового SetTimer/KillTimer?
ava
bilbobagginz | 12.12.2010, 01:26 #
Цитата (Cheloveck @ 5.12.2010, 16:26 findReferencedText)
Нужно выполнять функцию каждые n секунд. При этом рабочий поток должен работать и функция должна выполняться в рабочем потоке.

кажется немного не понял идею: т.е. рабочий поток надо приостановить, выполнить функцию, и продолжить.
или я недопонял ?

если я правильно понял, то создай вне рабочего потока поток с таймерами, который будет посылать сигнал/ы
а рабочий поток будет обрабатывать это сигнал/ы.

ессно, надо будет как-то аккуратно проработать момент, что ты обрабатываешь сигнал одного таймера, и в это время к тебе стучится второй..

ava
brainstream | 12.12.2010, 11:58 #
Цитата (bilbobagginz @ 12.12.2010, 01:26 findReferencedText)
или я недопонял ?

Ну, мне нужны какие-то сообщения, сигнал итп.
Цитата (bilbobagginz @ 12.12.2010, 01:26 findReferencedText)
оздай вне рабочего потока поток с таймерами, который будет посылать сигнал/ы

а рабочий поток будет обрабатывать это сигнал/ы.

Я специально проверял, в венде SetTimer не создаёт поток. Таймер работает где-то в ядре. Как создать таймер в отдельном потоке я знаю. Но странно, что его нет в стандартной библиотеке.

ava
bilbobagginz | 13.12.2010, 01:31 #
Цитата (Cheloveck @ 12.12.2010, 10:58 findReferencedText)
Я специально проверял, в венде SetTimer не создаёт поток.

что-то там создается, но меня другой вопрос интересует: какая тебе на фих разница: создается поток или нет ?
проясни требования .....
ava
brainstream | 13.12.2010, 02:38 #
Цитата (bilbobagginz @ 13.12.2010, 01:31 findReferencedText)
какая тебе на фих разница: создается поток или нет ?

принципиальная =)

Цитата (bilbobagginz @ 13.12.2010, 01:31 findReferencedText)
проясни требования .....

Обсервер. Объект рассылает уведомления подписчикам, в том числе и о таймауте.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
advanced
Absenden