Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 13, 2012 13:15:53

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

threading.Timer

привет.

нужен таймер. как я понял мне нужно threading.Timer

import threading
print 'start'
def get1():
    print u'hello'
t = threading.Timer(1.0, get1)
t.start()

так функция get1 выполняется один раз, если я добавлю t.start() в функцию get1() то получу ошибку
RuntimeError: threads can only be started once

как запустить повторно таймер?

вот так работает так как надо
import threading
a=1
def get1():
    global a
    if a!=5:
        a+=1
        print u'hello'
        t = threading.Timer(1.0, get1)
        t.start()
    else:
        pass
get1()
но тут постоянно создается экземпляр класса

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

Офлайн

#2 Авг. 13, 2012 13:58:39

Zerstoren
От:
Зарегистрирован: 2011-07-11
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

threading.Timer

Заюзайте Queue.
Метод Queue.put может юзать таймаут

http://docs.python.org/library/queue.html



Офлайн

#3 Авг. 13, 2012 14:28:11

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

threading.Timer

это кажись для 3 питона. нужна под второй

Офлайн

#4 Авг. 13, 2012 14:32:57

Zerstoren
От:
Зарегистрирован: 2011-07-11
Сообщения: 17
Репутация: +  1  -
Профиль   Отправить e-mail  

threading.Timer

ilnur
жись для 3 питона. нужна под второй

Очереди работаю и под 2 пайтоном.
В добавок - эта штука была введена еще в версии 2.3



Офлайн

#5 Авг. 13, 2012 15:01:26

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

threading.Timer

# -*- coding:utf-8 -*-
import Queue
q = Queue.Queue(maxsize=1)
timeout=2
iters=5
def foo(i):
    print i
q.put(None)
for i in range(iters):
    try:
       q.put(foo(i), timeout=timeout)
    except:
       print "Waiting"



Офлайн

#6 Авг. 13, 2012 15:10:50

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

threading.Timer

Zerstoren
Заюзайте Queue.
Метод Queue.put может юзать таймаут
Как-то через попчанский.

А чем не угодил sleep?

Отредактировано odnochlen (Авг. 13, 2012 15:12:59)

Офлайн

#7 Авг. 13, 2012 15:30:56

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

threading.Timer

time.sleep()? он тормозит основной поток программы.

Офлайн

#8 Авг. 13, 2012 15:43:31

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

threading.Timer

Да, но ты вызываешь в таймере функцию, которая запускает таймер. Можешь обьяснить, зачем тебе это надо?

Офлайн

#9 Авг. 13, 2012 16:21:37

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

threading.Timer

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

цикл со sleep не катит


примерно такой код

def get():
    # здесь что-то делается
    if i=0:
        # и если что-то не так, запустить таймер, который через время выполнит эту функцию
        # если написать t.start() то получаю ошибку
t = threading.Timer(1.0, get)
t.start()

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

Офлайн

#10 Авг. 13, 2012 16:23:49

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

threading.Timer

odnochlen
Да, но ты вызываешь в таймере функцию, которая запускает таймер. Можешь обьяснить, зачем тебе это надо?
потому что если юзать это
import threading
print 'start'
def get1():
    print u'hello'
t = threading.Timer(1.0, get1)
t.start()
то через 1 секунду выполнится функция get1() и все, а мне надо по кругу чтобы выполнялась эта функция. но без слипа

Отредактировано ilnur (Авг. 13, 2012 16:59:35)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version