2016-04-28 1 views
0

Ich versuche zu verstehen, wie Multiprozess-Pools arbeiten. In der folgenden Programmierung habe ich einen Pool von 4 Prozessen erstellt.Verwendung von apply_async mit Callback-Funktion für einen Pool von Prozessen

Und ich rufe apply_async mit einer Callback-Funktion, die eine Liste aktualisieren sollte result_list genannt

import Queue 
from multiprocessing import Process 
from multiprocessing import Pool 

result_list = [] 

def foo_pool(q): #Function for each process 
    print "foo_pool" 
    if(q.qsize() > 0): 
     number = q.get() 
    return number * 2 

def log_result(result): 
    # This is called whenever foo_pool(i) returns a result. 
    # result_list is modified only by the main process, not the pool workers. 
    result_list.append(result) 

if __name__ == "__main__": 
    q = Queue.Queue() 
    for i in range(4): 
     q.put(i + 1) #Put 1..4 in the queue 

    p = Pool(4) 
    p.apply_async(foo_pool, args = (q,), callback = log_result) 

Ich weiß, ich habe keine Warteschlange hier verwenden müssen. Aber ich teste das für ein anderes Programm, das erfordert, dass ich eine Warteschlange benutze. Wenn ich das Programm starte, wird die Funktion foo_pool nicht aufgerufen. Die Druckanweisung print "foo_pool" wird nicht ausgeführt. Warum ist das?

Antwort

1

Grob gesagt, apply_async nur async Aufgabe planen, aber nicht ausführen. Sie müssen p.close() und p.join() aufrufen, um die Ausführung auszulösen, oder r = p.apply_async() und r.get().

Verwandte Themen