Discussion:
Cykliczne wywoływanie funkcji?
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Łukasz Gąsiorek
2009-04-22 18:00:07 UTC
Permalink
Witam,

Potrzebuję napisać wątek w którym pewien kod będzie się wykonywał
co x sekund przez cały czas od początku uruchomienia programu.

W dokumentacji znalazłem taki przykład:

def hello():
print "hello, world"

t = Timer(30.0, hello)
t.start()

ale gdybym w funkcji hello() napisał nieskończoną pętle
a w niej wykonywał odpowiedni kod i na końcu
time.sleep(10) uzyskałbym to co potrzebuję
ale czy to dobre rozwiązanie?
A może wywoływać funkcję hello() rekurencyjnie?

def hello():
# kod
time.sleep(10)
hello()

Nie znam za bardzo pythona, więc chciałbym się upewnić.

Pozdrawiam
Piotr Husiatynski
2009-04-22 18:07:25 UTC
Permalink
Post by Łukasz Gąsiorek
Witam,
Potrzebuję napisać wątek w którym pewien kod będzie się wykonywał
co x sekund przez cały czas od początku uruchomienia programu.
print "hello, world"
t = Timer(30.0, hello)
t.start()
ale gdybym w funkcji hello() napisał nieskończoną pętle
a w niej wykonywał odpowiedni kod i na końcu
time.sleep(10) uzyskałbym to co potrzebuję
ale czy to dobre rozwiązanie?
A może wywoływać funkcję hello() rekurencyjnie?
# kod
time.sleep(10)
hello()
To będzie pewnie odkładać na stosie kolejne wywołania hello, aż w końcu
zabraknie pamięci.
Post by Łukasz Gąsiorek
Nie znam za bardzo pythona, więc chciałbym się upewnić.
Pozdrawiam
def hello():
while True:
# code
time.sleep(10)
--
pozdrawiam
Piotr Husiaty?ski
Łukasz Gąsiorek
2009-04-22 19:46:18 UTC
Permalink
Post by Piotr Husiatynski
Post by Łukasz Gąsiorek
Witam,
Potrzebuję napisać wątek w którym pewien kod będzie się wykonywał
co x sekund przez cały czas od początku uruchomienia programu.
print "hello, world"
t = Timer(30.0, hello)
t.start()
ale gdybym w funkcji hello() napisał nieskończoną pętle
a w niej wykonywał odpowiedni kod i na końcu
time.sleep(10) uzyskałbym to co potrzebuję
ale czy to dobre rozwiązanie?
A może wywoływać funkcję hello() rekurencyjnie?
# kod
time.sleep(10)
hello()
To będzie pewnie odkładać na stosie kolejne wywołania hello, aż w końcu
zabraknie pamięci.
No tak racja, nie pomyślałem o tym.

Rob Wolfe
2009-04-22 19:15:30 UTC
Permalink
Post by Łukasz Gąsiorek
Witam,
Potrzebuję napisać wątek w którym pewien kod będzie się wykonywał
co x sekund przez cały czas od początku uruchomienia programu.
print "hello, world"
t = Timer(30.0, hello)
t.start()
Tak powiem na wszelki wypadek, bo już się spotkałem z tym,
że ludzie myślą, że metoda `hello` będzie się wykonywała cały czas
w pętli co 30 sekund.
Pragnę to z tego miejsca zdementować. Zostanie wykonana TYLKO RAZ.

Poza tym dochodzi problem tego, że utworzony wątek nie jest demonem,
także zakończenie programu w trakcie gdy `Timer` jest w stanie oczekiwania
jest niemożliwe. No chyba, że się dorzuci to:
t.setDaemon(True)
Post by Łukasz Gąsiorek
ale gdybym w funkcji hello() napisał nieskończoną pętle
a w niej wykonywał odpowiedni kod i na końcu
time.sleep(10) uzyskałbym to co potrzebuję
ale czy to dobre rozwiązanie?
Bardzo dobre. Proste i skuteczne.
Post by Łukasz Gąsiorek
A może wywoływać funkcję hello() rekurencyjnie?
# kod
time.sleep(10)
hello()
Nie znam za bardzo pythona, więc chciałbym się upewnić.
Jak już zostało powiedziane, to baaaarrrrdddzzzo nie dobry pomysł.

RW
Loading...