2016-04-06 13 views
1

Büyük bir hesaplamayı hızlandırmak için çok işlemli bir kuyruğa dönüştürülmüş bir işlemi yeniden yazıyorum. Yolun% 95'ini aldım, ama Queuemultiprocessing'u kullanarak ne zaman sinyal vereceğini anlayamıyorum. BöylePython Çoklu İşlem - 'Kuyruk' nesnesi 'task_done'/'join' özelliğine sahip değil

import Queue 
from threading import Thread 

num_fetch_threads = 4 
enclosure_queue = Queue() 

for i in range(num_fetch_threads): 
    worker = Thread(target=run_experiment, args=(i, enclosure_queue)) 
    worker.setDaemon(True) 
    worker.start() 

for experiment in experiment_collection: 
    enclosure_queue.put((experiment, otherVar)) 

enclosure_queue.join() 

Ve kuyruk fonksiyonu:

:

def run_experiment(i, q): 
    while True: 
    ... do stuff ... 
    q.task_done() 

Benim yeni kod aşağıdaki gibi bazı şeyleri olduğunu


Benim asıl kod aşağıdaki gibi bir şeydir

from multiprocessing import Process, Queue 

num_fetch_threads = 4 
enclosure_queue = Queue() 

for i in range(num_fetch_threads): 
    worker = Process(target=run_experiment, args=(i, enclosure_queue)) 
    worker.daemon = True 
    worker.start() 

for experiment in experiment_collection: 
    enclosure_queue.put((experiment, otherVar)) 

worker.join() ## I only put this here bc enclosure_queue.join() is not available 

Ve yeni kuyruk fonksiyonu:

def run_experiment(i, q): 
    while True: 
    ... do stuff ... 
    ## not sure what should go here 

Ben dokümanlar ve Google'ı okuma olmuştur ama ne ben eksik anlamaya olamaz - ben task_done/join bir parçası değildir biliyorum multiprocessingQueue sınıfı, ama ne kullanmam gerektiği açık değil.

"Onlar bu Kuyruğu farklılık task_done (yoksun) ve) (Python 2.5 en Queue.Queue sınıfına sokulan yöntemleri katılırlar." Sıra yapıldığını bilir ve nasıl program ile devam etmek nasıl

Ama bunlardan birini olmadan Source, emin değilim.

cevap

2

Çalışanları elle yönetmek yerine multiprocessing.Pool kullanmayı düşünün. Havuz, işçilere görevler göndererek, harita ve uygulama gibi uygun işlevlerle gönderir ve .close ve .join yöntemlerini destekler. Pool, işlemler arasındaki sıraları işlemeye ve sonuçları işlemeye özen gösterir. Kodunuzun multiprocessing.Pool:

from multiprocessing import Pool 

def do_experiment(exp): 
    # run the experiment `exp`, will be called by `p.map` 
    return result 

p = Pool() # automatically scales to the number of CPUs available 

results = p.map(do_experiment, experiment_collection) 
p.close() 
p.join() 
ile nasıl görüneceği aşağıda açıklanmıştır.