2010-08-08 14 views
26

Voglio sapere come chiamare una funzione dopo un certo tempo. Ho provato time.sleep() ma questo interrompe l'intero script. Voglio che lo script continui, ma dopo ??? secs chiama una funzione ed eseguo l'altro script allo stesso tempoDelay Time Python

risposta

47

Dai uno sguardo a threading.Timer. Esegue la tua funzione in una nuova discussione.

from threading import Timer 

def hello(): 
    print "hello, world" 

t = Timer(30.0, hello) 
t.start() # after 30 seconds, "hello, world" will be printed 
+0

multithreading ... hmm, suona familiare. Non è che c'erano più di un processo? Beh, comunque, sembra giusto. se uso t.start() più di una volta, continua, mi dà un errore o riavvia il timer? – drnessie

+0

@drnessie: "Non è che c'era più di un processo?" No - è quando hai più di un thread. "se uso t.start() più di una volta, continua, mi dà un errore o riavvia il timer?" - Si ottiene un errore 'RuntimeError: thread già avviato' che è possibile verificare facilmente duplicando l'ultima riga nel codice sorgente sopra riportato e eseguendola. –

+0

Esiste un modo per eliminare l'errore, oltre a fermarsi e riavviare il timer? – drnessie

3

Se si desidera che una funzione venga chiamata dopo un po 'e non si interrompa lo script, si tratta in modo inerente del codice thread. Se vuoi impostare una funzione da chiamare e non preoccuparti, devi usare esplicitamente il multithreading come risposta di Mark Byers o usare un framework di codifica che ha un ciclo principale che si occupa della distribuzione delle funzioni per tu - come contorto, qt, gtk, pyglet e tanti altri. Ognuno di questi richiederebbe di riscrivere il codice in modo che funzioni dal ciclo principale di quel framework.

È o quello, o si scrive qualche ciclo principale dall'evento controllandosi sul proprio codice - Tutto sommato, se l'unica cosa che si desidera è una chiamata a funzione singola, threading.Timer è il modo per farlo. Se si desidera utilizzare queste chiamate a tempo per eseguire effettivamente il loop del programma come di solito si fa con setTimeout di javascript, è meglio selezionare uno dei framework di codifica che ho elencato sopra e rielaborare il codice per sfruttarlo.

+0

Questo codice non funziona Threading.Timer (30.0, self.timestart (finestra)) .start() Si chiama self.timestart, dando la finestra arg, ma che sta facendo subito, non dopo 30secs Would Ho chiesto a Mark, ma l'ho infastidito abbastanza, e sai anche tu cosa stai parlando :) – drnessie

-4
import threading 

def time_demo(): 
    threading.Timer(5.0, time_demo()).start() 

print 'Hello this is time demo function' 
time_demo() 
+1

Il tuo codice si arresta in modo anomalo perché hai una ricorsione infinita in esso, devi rimuovere le parentesi quando passi in time_demo perché dovrebbe passare in un puntatore a funzione. – cujo