Найти - Пользователи
Полная версия: threading.Timer
Начало » Python для новичков » threading.Timer
1 2 3
ilnur
привет.

нужен таймер. как я понял мне нужно 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()
но тут постоянно создается экземпляр класса
Zerstoren
Заюзайте Queue.
Метод Queue.put может юзать таймаут

http://docs.python.org/library/queue.html
ilnur
это кажись для 3 питона. нужна под второй
Zerstoren
ilnur
жись для 3 питона. нужна под второй

Очереди работаю и под 2 пайтоном.
В добавок - эта штука была введена еще в версии 2.3
FishHook
# -*- 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"
odnochlen
Zerstoren
Заюзайте Queue.
Метод Queue.put может юзать таймаут
Как-то через попчанский.

А чем не угодил sleep?
ilnur
time.sleep()? он тормозит основной поток программы.
odnochlen
Да, но ты вызываешь в таймере функцию, которая запускает таймер. Можешь обьяснить, зачем тебе это надо?
ilnur
мне нужно выполнить функцию через время, в зависимости от параметров, может потребоваться ещё раз выполнить функцию.

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


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

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

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