2009-04-08 10 views
12

Sto realizzando un programma per l'esecuzione di simulazioni in Python, con un'interfaccia wxPython. Nel programma, è possibile creare una simulazione e il programma esegue il rendering (= calcola) per te. Il rendering può richiedere molto tempo.Python/wxPython: esecuzione continua in background

Quando l'utente avvia una simulazione e definisce uno stato iniziale, voglio che il programma renda la simulazione continuamente in background, mentre l'utente potrebbe fare cose diverse nel programma. Un po 'come una barra in stile YouTube che si riempie: puoi giocare la simulazione solo fino al punto che è stato renderizzato.

Come si esegue la funzione di rendering?

risposta

4

Avvia una nuova procedura per eseguire il rendering in background e verificare periodicamente se è stata restituita.

È possibile trovare la documentazione per il modulo di sottoprocesso here e il modulo multiprocessore here. Come ha detto Jay, il multiprocesso è probabilmente meglio se stai usando Python 2.6. Detto questo, non penso che ci sarebbe alcuna differenza di prestazioni tra i due. Il multiprocesso sembra essere un involucro attorno al sottoprocesso rendendo più semplici le cose da fare.

Mentre il sottoprocesso/multiprocesso è il metodo standard per eseguire questa operazione, è anche possibile dare un'occhiata a Parallel Python.

+0

Non ho mai lavorato con più processi prima. Da dove comincio? Inoltre, ho capito che ci sono diversi modi per farlo. Quale dovrei scegliere? –

+0

N.B., Tieni presente che poiché questo è un programma per fare simulazioni, le prestazioni sono molto importanti. –

+0

Se si può usare python 2.6, credo che il modulo multiprocessing sarebbe il modo standard per farlo. Dovrebbe fornire le stesse prestazioni che il sistema operativo e l'hardware devono fornire. –

7

Vorrei utilizzare un codice threading.Thread per eseguire il codice in background e wx.CallAfter per pubblicare aggiornamenti sul thread della finestra per renderli all'utente.

thread = threading.Thread(target=self.do_work) 
thread.setDaemon(True) 
thread.start() 

... 

def do_work(self): 
    # processing code here 
    while processing: 
     # do stuff 
     wx.CallAfter(self.update_view, args, kwargs) 

def update_view(self, args): 
    # do stuff with args 
    # since wx.CallAfter was used, it's safe to do GUI stuff here 
0

Se non ti dispiace utilizzando un approccio leggermente diverso, è possibile dare un'occhiata a stackless pitone e creare un tasklet per il processo di rendering. Lo trovo molto facile da usare personalmente.

7

C'è un bel po 'di informazioni sul wxPython wiki about long running tasks che potrebbe essere utile. Fondamentalmente fanno uso di un thread e wx.PostEvent per gestire le comunicazioni tra il thread e il ciclo di eventi wx principale.