2017-06-29 10 views
0

私は、Pythonで並列に実行されているプロセスから結果を返そうとしています。ここにコードがあります。プロセスプールのpythonでの注文

from dateutil.parser import parse 
from multiprocessing.dummy import Pool 
from itertools import * 
import time 
import random 

def abcd(a): 
    time.sleep(a) 
    print(a) 
    return a 

p = Pool(3) 
a = p.starmap(abcd, zip([10, 2, 15])) 
p.close() 
p.join() 
print(a) 

結果は常にzip内の配列の順番で返されますか?

答えて

1

Pool.starmap(およびPool.map)は、引き渡された引数の順番で値を返しますが、これは順序どおりに実行されるわけではありません。あなたが注文を気にせず、の順序が無ければ、の結果が得られます(さらにパフォーマンスが向上する可能性があります)。Pool.imap_unorderedです。

the documentation

0

最終的にOSがプロセスのスケジューリングを処理するため、それらが同じ順序になるという保証はありません。それらは同じ順序で終了する可能性があります。にchunksizeを1に設定すると、チャンスを増やすことができます。それ以外の場合は、結果はチャンクサイズごとにグループ化された実行順序になります。

その後の元の順序を知る必要がある場合、私が使用するトリックは、ワーカー関数によって再放出されたばかりのインデックス(またはn次元データの場合はnumpy.ndindex)を渡すことです。