2016-11-18 39 views
3

にリストを処理していない私は、並行して、いくつかのURLを処理するために、このスクリプトを持っている:リストが注文されマルチプロセッシングpool.map順

import multiprocessing 
import time 

list_of_urls = [] 

for i in range(1,1000): 
    list_of_urls.append('http://example.com/page=' + str(i)) 

def process_url(url): 
    page_processed = url.split('=')[1] 
    print 'Processing page %s'% page_processed 
    time.sleep(5) 

pool = multiprocessing.Pool(processes=4) 
pool.map(process_url, list_of_urls) 

を、私はそれを実行すると、スクリプトは、リストからURLを取得しません。

Processing page 1 
Processing page 64 
Processing page 127 
Processing page 190 
Processing page 65 
Processing page 2 
Processing page 128 
Processing page 191 

代わりに、1,2,3,4ページを最初に処理してから、リストの順序に従います。これを行うオプションはありますか?

+0

タスクを複数のコアに分割しても、順番に実行したいと言っていますか?または、正しい順序で処理されたURLの出力リストが必要なものです。あなたの質問は最初のことを示唆しています。 –

+0

最初のもの。あなたは "最大並列ダウンロード"を設定するダウンロードマネージャでやっているように、それらはまだ順番に実行されます。私は4つのURLを時間通りに処理したい、例:1,2,3,4で始める。3が終了し、1,2,4がまだ実行されている場合は、5番目(http://example.com/page=5) – Hyperion

+0

しかし、ワーカー関数に戻り値がある場合、戻り値の結果リストの順序は、入力パラメーターのリストの順序に対応します。作業者関数が順序付けられていなくても処理されます。 – elcombato

答えて

1

あなたは引数のチャンクマップを渡さない場合は、このアルゴリズムを使用してチャンクを計算します:

chunksize, extra = divmod(len(iterable), len(self._pool) * 4) 
if extra: 
    chunksize += 1 

それはtask_batchesにあなたのiterableをcutingとsperateプロセス上でそれを実行しています。それが秩序ではない理由です。ソリューションは、チャンクの平等を1に宣言することです。

import multiprocessing 
import time 

list_test = range(10) 

def proces(task): 
    print "task:", task 
    time.sleep(1) 

pool = multiprocessing.Pool(processes=3) 
pool.map(proces, list_test, chunksize=1) 

task: 0 
task: 1 
task: 2 
task: 3 
task: 4 
task: 5 
task: 6 
task: 7 
task: 8 
task: 9 
+2

ほとんどの場合、 'chunksize = 1'はパフォーマンスを大幅に低下させることに注意してください。 – BallpointBen

0

マルチプロセッシングは非同期操作であり、定義上は非シーケンシャルであることを意味します。スレッド(またはPythonのケースのプロセスで)あなたのリストからURLを取得し、どのプロセスが最初に終了する保証はありません。したがって、url 1はurl 64より前に処理を開始するかもしれませんが、例えばネットワークI/Oのランダム性のために、url 64が最初に終了することがあります。

まず、これらの操作を順番に実行する必要があるかどうかを確認してください。答えが「はい」の場合、すべての並列計算を最初に完了させてから、その完了した結果をソートするブロッキングステップを実行するのが最善の方法です。

あなたのURLのリストが非常に大きく、順序のいくつかの要素を必要としながらも並列化を利用したい場合は、リストをチャンクして上の並列ロジックを順番に実行します。

関連する問題