2012-03-28 14 views
51

La documentazione del modulo multiprocessing mostra come passare una coda a un processo avviato con multiprocessing.Process. Ma come posso condividere una coda con processi di lavoro asincroni avviati con apply_async? Non ho bisogno di unioni dinamiche o altro, solo un modo per i lavoratori di (ripetutamente) riportare i risultati alla base.Condivisione di una coda di risultati tra più processi

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    q = multiprocessing.Queue() 
    workers = pool.apply_async(worker, (33, q)) 

questo viene a mancare con: RuntimeError: Queue objects should only be shared between processes through inheritance. Capisco cosa significa, e capisco il consiglio di ereditare piuttosto che richiedere il decapaggio/disfacimento (e tutte le restrizioni speciali di Windows). Ma come do Ho passato la coda in un modo che funziona? Non riesco a trovare un esempio e ho provato diverse alternative che hanno fallito in vari modi. Aiuto per favore?

risposta

73

Provare a utilizzare multiprocessing.Manager per gestire la coda e renderla accessibile anche a diversi operatori.

import multiprocessing 
def worker(name, que): 
    que.put("%d is done" % name) 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=3) 
    m = multiprocessing.Manager() 
    q = m.Queue() 
    workers = pool.apply_async(worker, (33, q)) 
+0

Questo ha funzionato, grazie! C'era un problema non correlato con la chiamata asincrona nel mio codice originale, quindi ho copiato la correzione anche sulla tua risposta. – alexis

Problemi correlati