Найти - Пользователи
Полная версия: threading.Timer
Начало » Python для новичков » threading.Timer
1 2 3
odnochlen
ilnur
а мне надо по кругу чтобы выполнялась эта функция.
while True:
    get1()
    time.sleep(1)
Ты не с яваскрипта часом?
dimy44
Your text to link here…
ilnur
я же пищу что без sleep надо, она тормозит прогу

dimy44
спасибо. посмотрю
EBFE
import threading
import time
print 'start'
def get1():
    while True:
        print u'hello'
        time.sleep(1.0)
t = threading.Thread(target=get1)
t.start()
Отгадайте, что использует threading.Timer
def Timer(*args, **kwargs):
    return _Timer(*args, **kwargs)
class _Timer(Thread):
    """Call a function after a specified number of seconds:
    t = Timer(30.0, f, args=[], kwargs={})
    t.start()
    t.cancel() # stop the timer's action if it's still waiting
    """
    def __init__(self, interval, function, args=[], kwargs={}):
        Thread.__init__(self)
        self.interval = interval
        self.function = function
        self.args = args
        self.kwargs = kwargs
        self.finished = Event()
    def cancel(self):
        """Stop the timer if it hasn't finished yet"""
        self.finished.set()
    def run(self):
        self.finished.wait(self.interval)
        if not self.finished.is_set():
            self.function(*self.args, **self.kwargs)
        self.finished.set()
odnochlen
ilnur
она тормозит прогу
Она тормозит не прогу, а тред, в котором она работает. С таким же успехом ты можешь запихнуть в отдельный тред бесконечный цикл со sleep. Больше мне сказать нечего, пока ты не поделишься мыслью, что же конкретно ты хочешь сделать и чем не устраивают варианты, которые я привел.
ilnur
odnochlen
пока ты не поделишься мыслью,
вроде поделился же.
мне надо запустить функцию через определенное время. но не тормозя основной поток программы.
типа таймера, чтобы через определненный промежуток времени выполнялась функция.
ну я уж не знаю как тебе объяснить

пусть будет будильник на каждый день.
есть функция, после запуска проверяет время, и если она равна исходному, то проиграть музыку, а если не равна, то через 10 минут проверить ещё раз. и так далее. если использовать слип, то прога просто встанет.

поэтому надо без слипа.

EBFE
Отгадайте, что использует threading.Timer
эх. пока не отгадаю :(
EBFE
ilnur
и так далее. если использовать слип, то прога просто встанет.
Многопоточность для этого и существует (конечно можно упорно изобретать велосипеды и обходится без этих новомодных штучек )
эх. пока не отгадаю
А чем не устраивают:
import threading
def get1():
    threading.Timer(4.0, get1).start()
    print "hello"
get1()
или
def get1():
while True:
time.sleep(1.0)
print "hello"
t = threading.Thread(target = get1)
t.start()
ну или “будильник”
import time
import threading
class MyScheduler(threading.Thread):
    def __init__(self, start_time, interval, target, *args):
        super(MyScheduler, self).__init__()
        if start_time is not None:
            self._start = self.from_string(start_time)
        else:
            self._start = time.time() + interval
        self.interval = interval
        self.target = target
        self.args = args
        self.daemon = True
    def run(self):
        sleep_time = max(0, self._start - time.time())
        time.sleep(sleep_time)
        while True:
            self.target(*self.args)
            time.sleep(self.interval)
    def from_string(self, time_str):
        return time.mktime(time.strptime(time_str, "%d.%m.%y %H:%M:%S"))
def printer(arg):
    print arg
MyScheduler("13.08.12 18:29:20", 2.0, printer, "hello").start()
MyScheduler("10.10.01 10:11:12", 4.0, printer, "hello").start()
MyScheduler(None, 3.0, printer, "hello").start()
?
odnochlen
EBFE
def get1():
    while True:
        time.sleep(1.0)
        print "hello"
t  = threading.Thread(target = get1)
t.start()
Я так и предлагал.
С вызовом таймера из самой функции могут быть интересные проблемы, когда функция не успеет завершиться до повторного срабатывания таймера - и добро пожаловать в состояние гонки.

Человек явно пришел с яваскрипта, там имхо по-другому паузу и не сделать.

Вот еще кстати: http://odiszapc.ru/2012/03/10/python-waitable-timer/

Кстати! Как компенсировать время выполнения функции? Можно сделать так, чтобы интервал между вызовами был как можно ближе к паузе (естественно, если это время меньше ее)?
Seganapa
odnochlen Спасибо за ссылку! Тоже искал это…
ilnur
odnochlen
Человек явно пришел с яваскрипта
нет. я явно пришел с таким вопросом из pys60
там есть класс такой. e32.Ao_timer() который один раст создается и его можно где угодно запустить

def get1():
    print "hello"
    t.after(10, get1)
t  = e32.Ao_timer()
t.after(10, get1)
EBFE
А чем не устраивают:
import threading
def get1():
    threading.Timer(4.0, get1).start()
    print "hello"
get1()
он устраивает. я же писал в первом посте. но если его заюзать, будет же всегда создаваться новый класс threading.Timer() что будет постоянно уменьшать оперативку, не?

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB