2013-05-06 13 views
5

voglio creare molti processi, ogni processo viene eseguito 5 secondi dopo che un processo precedente, vale a dire, l'intervallo di tempo tra ogni processo inizia è di 5 secondi, in modo che: run processo 1 attendere 5 secondi processo run 2 attendere 5 secondi processo esecuzione 3 attendere 5 secondi .....come recuperare processo dal pool di processi di pitone

come:

 for i in range(10): 
      p = multiprocessing.Process(target=func) 
      p.start() 
      sleep(5) 
     #after all child process exit 
     do_something() 

ma voglio chiamare fa_qualcosa() dopo tutto il processo di uscita non so come fare la sincronizzazione qui

con una piscina libary pitone, posso avere

pool = multiprocessing.Pool(processes=4) 
    for i in xrange(500): 
      pool.apply_async(func, i) 
    pool.close() 
    pool.join() 
    do_something() 

ma in questo modo, 4 processi verranno eseguiti simultaneamente, non riesco a decidere l'intervallo di tempo tra i processi, è possibile creare un pool di processi e poi prendere ogni processo, qualcosa come

pool = multiprocessing.Pool(processes=4) 
for i in xrange(500): 
    process = pool.fetch_one() 
    process(func, i) 
    time.sleep(5) 
pool.close() 
pool.join() 
do_something() 

ci sono snippet di una libreria o di un codice sorgente che soddisfano le mie esigenze? grazie

+2

Forse potresti aggiungere un argomento alla tua funzione che è il numero di secondi di attesa prima dell'elaborazione? E calcola quel valore come 5 * i? – mdscruggs

+2

vuoi chiamare 'func' ogni 5 secondi 500 volte? Perché il ritardo? Quanto dura una chiamata 'func'? Vuoi limitare il numero di chiamate simultanee (simultanee)? Cosa succede se aggiungete 'time.sleep()' dopo 'apply_async()'? Cosa vuoi che succeda, invece? – jfs

+0

una chiamata 'func' dura per 25 secondi. e voglio chiamare 'func' ogni 5 secondi per molte volte, forse 500 o 1000. – misteryes

risposta

0

solo per mettere insieme i suggerimenti, si potrebbe fare qualcosa di simile:

plist = [] 
for i in range(10): 
    p = multiprocessing.Process(target=func) 
    p.start() 
    plist.append(p) 
    sleep(5) 
for p in plist: 
    p.join() 
do_something() 

Si potrebbe dare un argomento timeout per join() al fine di gestire i processi bloccati; in tal caso dovresti continuare a scorrere l'elenco, rimuovendo i processi terminati finché la lista non è vuota.

Problemi correlati