ダウンロードは IO に制限されているため、実際には IPython.parallel よりも単純な ThreadPool をお勧めします (注: 私は IPython.parallel の作成者です)。始めるのははるかに簡単で、 IPython.parallel が行うことのどれも、提示されたケースに実際には役立ちません。
テスト要求にゆっくりと応答する単純なサーバーをセットアップしました。
遅いサーバーへの簡単なリクエストをテストする リクエストされ/NUMBER
た数でリクエストに応答するだけですが、サーバーはリクエストの処理が人為的に遅くなります。
import requests
r = requests.get("http://localhost:8888/10")
r.content
'10'
この関数は、指定された ID の URL をダウンロードし、結果を解析しますget_data
(int の str を int にキャストします)。
def get_data(ID):
"""function for getting data from our slow server"""
r = requests.get("http://localhost:8888/%i" % ID)
return int(r.content)
次に、さまざまな数の同時スレッドを使用して、スレッドプールを使用して一連のデータを取得することをテストします。
from multiprocessing.pool import ThreadPool
IDs = range(128)
for nthreads in [1, 2, 4, 8, 16, 32]:
pool = ThreadPool(nthreads)
tic = time.time()
results = pool.map(get_data, IDs)
toc = time.time()
print "%3i threads: %5.1f seconds" % (nthreads, toc-tic)
1 threads: 26.2 seconds
2 threads: 13.3 seconds
4 threads: 6.7 seconds
8 threads: 3.4 seconds
16 threads: 1.8 seconds
32 threads: 1.1 seconds
これを使用して、ケースに適したスレッド数を把握できます。また、ThreadPool を ProcessPool に簡単に置き換えて、より良い結果が得られるかどうかを確認することもできます。
この例は IPython Notebookです。