2012-03-28 17 views
51

multiprocessing modülünün belgeleri, bir kuyruğun multiprocessing.Process ile başlatılan bir işleme nasıl geçirileceğini gösterir. Ancak, apply_async ile başlayan eşzamansız çalışan işlemleri olan bir sırayı nasıl paylaşabilirim? Dinamik birleşme ya da başka bir şeye ihtiyacım yok, sadece işçilerin sonuçlarını üsse rapor etmeleri için (tekrar tekrar) bir yol. RuntimeError: Queue objects should only be shared between processes through inheritance:Birkaç işlem arasında bir sonuç kuyruğunu paylaşma

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

Bu başarısız olur. Bunun ne anlama geldiğini anlıyorum ve dekapaj/ayrılmayı (ve tüm özel Windows kısıtlamalarını) gerektirmekten ziyade devralma tavsiyesini anlıyorum. Ama nasıl yapmak Kuyruğu bir şekilde çalışır? Bir örnek bulamıyorum ve çeşitli şekillerde başarısız olan birkaç alternatifi denedim. Yardım lütfen?

cevap

73

Sıranızı yönetmek ve aynı zamanda farklı çalışanlara erişilebilir hale getirmek için multiprocessing.Manager kullanmayı deneyin.

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

Bu, teşekkürler! Orijinal kodumda async çağrısı ile ilgisiz bir sorun vardı, ben de düzeltmeyi cevabınıza kopyaladım. – alexis

İlgili konular