2012-03-28 7 views
51

Dokumentacja modułu multiprocessing przedstawia sposób przekazywania kolejki do procesu rozpoczętego pod numerem multiprocessing.Process. Ale jak mogę udostępnić kolejkę z asynchronicznymi procesami roboczymi rozpoczętymi pod apply_async? Nie potrzebuję dynamicznego łączenia się ani niczego innego, tylko sposób, w jaki pracownicy (wielokrotnie) przekazują swoje wyniki z powrotem do bazy.Udostępnianie kolejki wyników między kilkoma procesami

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)) 

ten nie powiedzie się z: RuntimeError: Queue objects should only be shared between processes through inheritance. Rozumiem, co to oznacza, i rozumiem porady dotyczące dziedziczenia, zamiast wymagać marynowania/rozpakowywania (i wszystkich specjalnych ograniczeń Windows). Ale w jaki sposób przekazuję kolejkę w sposób, który działa? Nie mogę znaleźć przykładu i wypróbowałem kilka alternatyw, które zawiodły na różne sposoby. Prosimy o pomoc?

Odpowiedz

73

Spróbuj użyć funkcji multiprocessing.Manager, aby zarządzać kolejką i udostępniać ją innym pracownikom.

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

To się udało, dzięki! Wystąpił niezwiązany problem z połączeniem asynchronicznym w moim oryginalnym kodzie, więc skopiowałem poprawkę również do twojej odpowiedzi. – alexis