2016-04-28 5 views
0

マルチプロセスプールの仕組みを理解しようとしています。以下のプログラムでは、4つのプロセスのプールを作成しました。プロセスプールのコールバック関数でapply_asyncを使用する

そして私は私がここにキューを使用する必要はありません実現result_list

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) 

と呼ばれるリストを更新する必要があり、コールバック関数でapply_asyncを呼び出します。しかし、私はキューを使用する必要がある別のプログラムのためにこれをテストしています。 プログラムを実行すると、関数foo_poolが呼び出されていません。印刷文print "foo_pool"は実行されません。どうしてこれなの?

答えて

1

大まかに言えば、apply_asyncは非同期タスクをスケジュールするだけですが、実行しません。実行をトリガーするにはp.close()p.join()r = p.apply_async()r.get()に電話する必要があります。

関連する問題