2009-06-24 3 views

risposta

7

Molti programmatori cercano di evitare il codice multi-threaded, dal momento che è altamente soggetto ad errori di programmazione imperativa.

Se si desidera eseguire un'operazione pianificata in un ambiente a thread singolo, probabilmente è necessario un tipo di "Reactor". Potresti voler usare uno pronto all'uso come Twisted.

allora sarebbe una funzione di base fornito dal vostro reattore, ad esempio (con pygame):

pygame.time.set_timer - più volte di creare un evento sulla coda eventi

+5

"Molti programmatori cercano di evitare il codice multi-thread, dal momento che è molto incline agli errori nella programmazione imperativa." Un po 'fuori tema, ma non penso che questo sia un buon motivo per evitare il multi-thread. La chiave è di farlo correttamente e comprendere pienamente la coerenza della memoria e la semantica di blocco. Sono d'accordo che i programmatori con esperienza limitata di questo tipo di programmazione dovrebbero investire molto nell'apprendimento e nella pratica prima di utilizzare tali tecniche nel codice di produzione. Evitarlo nell'era della programmazione multi-core non è davvero un'opzione praticabile se si desidera utilizzare pienamente le risorse. – Scruffers

+3

@Scruffers multi-threaded è incredibilmente difficile da ottenere correttamente (e può essere solo [difficile da risolvere] (http://stackoverflow.com/questions/3830347/can-a-multi-threaded-program-ever-be-deterministic)), e ci sono molti altri modi per usare più core oltre i thread – dbr

2

Python ha una classe Timer nel modulo threading ma è un timer one-shot, quindi sarebbe meglio fare qualcosa come hai visto i link. http://code.activestate.com/recipes/65222/

Perché pensi che sia brutto, una volta scritto questo tipo di lezione sarà semplice come in Java.

se lo si utilizza all'interno di alcune GUI, ad es. wxPython che ha wx.Timer che puoi usare direttamente

7

Risposta non diretta alla domanda.

Sul sistema operativo Linux/Unix ci sono pochi modi per farlo e di solito mi basta scrivere il mio programma/script normalmente e quindi aggiungerlo a cron o qualcosa di simile (come launchd su OS X)

risposta alla la domanda inizia qui.

Utilizzare il modulo standard python sched - standard library documentation descrive alcune soluzioni ingegnose.

+3

+1: Usa cron - funziona. –

+1

Se si utilizza una soluzione "in Python", ci si deve preoccupare di mantenere lo script in esecuzione (dopo riavvii, arresti anomali, ecc.), Cron rimuove la necessità di ciò ed è molto semplice e affidabile. – dbr

7

provare il modulo multiprocessing.

from multiprocessing import Process 
import time 

def doWork(): 
    while True: 
     print "working...." 
     time.sleep(10) 



if __name__ == "__main__": 
    p = Process(target=doWork) 
    p.start() 

    while True: 
     time.sleep(60)