Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 13, 2012 17:35:33

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading.Timer

ilnur
а мне надо по кругу чтобы выполнялась эта функция.
while True:
    get1()
    time.sleep(1)
Ты не с яваскрипта часом?

Отредактировано odnochlen (Авг. 13, 2012 17:35:54)

Офлайн

#2 Авг. 13, 2012 18:44:07

dimy44
От: Евпатория
Зарегистрирован: 2012-04-21
Сообщения: 463
Репутация: +  42  -
Профиль  

threading.Timer

Офлайн

#3 Авг. 13, 2012 20:13:04

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

threading.Timer

я же пищу что без sleep надо, она тормозит прогу

dimy44
спасибо. посмотрю

Офлайн

#4 Авг. 13, 2012 20:45:37

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

threading.Timer

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()

Отредактировано EBFE (Авг. 13, 2012 21:52:16)

Офлайн

#5 Авг. 13, 2012 20:47:09

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading.Timer

ilnur
она тормозит прогу
Она тормозит не прогу, а тред, в котором она работает. С таким же успехом ты можешь запихнуть в отдельный тред бесконечный цикл со sleep. Больше мне сказать нечего, пока ты не поделишься мыслью, что же конкретно ты хочешь сделать и чем не устраивают варианты, которые я привел.

Офлайн

#6 Авг. 13, 2012 21:31:50

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

threading.Timer

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

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

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

EBFE
Отгадайте, что использует threading.Timer
эх. пока не отгадаю :(

Офлайн

#7 Авг. 13, 2012 23:34:27

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

threading.Timer

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()
?

Отредактировано EBFE (Авг. 13, 2012 23:47:34)

Офлайн

#8 Авг. 14, 2012 06:08:25

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

threading.Timer

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/

Кстати! Как компенсировать время выполнения функции? Можно сделать так, чтобы интервал между вызовами был как можно ближе к паузе (естественно, если это время меньше ее)?

Отредактировано odnochlen (Авг. 14, 2012 06:30:06)

Офлайн

#9 Авг. 14, 2012 07:28:17

Seganapa
От: Новороссийск
Зарегистрирован: 2012-07-31
Сообщения: 139
Репутация: +  0  -
Профиль   Отправить e-mail  

threading.Timer

odnochlen Спасибо за ссылку! Тоже искал это…



—————————————————————–
Изучаю и параллельно использую Python 2.7

Офлайн

#10 Авг. 14, 2012 08:30:56

ilnur
От: Казань
Зарегистрирован: 2009-01-06
Сообщения: 524
Репутация: +  22  -
Профиль   Отправить e-mail  

threading.Timer

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() что будет постоянно уменьшать оперативку, не?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version