2016-07-01 8 views
2

私はPythonが初めてです。 Google App Engineで簡単なスクリプトを実行して、できるだけ早く多くのファイルをオブジェクトに取得したいと考えています。並列化はスマートな選択肢になりますか?あなたは、リストの内包表記を使用して、コードよりPython的にする必要がありますブレーンストーミングデータをダウンロードする並列化ループ

import requests 

... 
theData=[] 
for q in range(0, len(theURLs)): 

    r = requests.get(theURLs[q]) 
    theData.insert(q,r.text) 

答えて

3

"普通の" Pythonでは、これはかなり簡単です。

from multiprocessing.pool import ThreadPool 
import requests 
responses = ThreadPool(10).map(requests.get, urls) 

最高の結果をもたらすスレッド数で10を置き換えます。

あなたは、URL Fetch serviceからこれらの行(未テスト)に沿って何かを非同期機能を使用することからなる産卵スレッド/プロセスと独自の非同期的なアプローチに制限がありGAEを、指定されたしかし:

rpcs = [urlfetch.create_rpc() for url in urls] 
for (rpc, url) in zip(rpcs, urls): 
    urlfetch.make_fetch_call(rpc, url) 
results = [rpc.get_result() for rpc in rpcs] 

必要になりますエラー処理を追加する必要があります...

3

を事前に感謝します:

# A list of tuples 
theData = [(q,requests.get(theURLs[q]).text) for q in range(0, len(theURLs))] 

# ... or ... 

# A list of lists 
theData = [[q,requests.get(theURLs[q]).text] for q in range(0, len(theURLs))] 

あなたが同時にthreadingライブラリを使用するファイルを検索したい場合は、このウェブサイトは、いくつかの良いを持っています私は真剣にそれを疑う

http://www.tutorialspoint.com/python/python_multithreading.htm

+0

すべてのことがちょうど1行で、それは優雅です!最初の引数としてqがなくても、 'theData = [q、requests.get(theURLs [q])。範囲内のqのテキスト(0、len(theURLs)) '?さもなければ私はエラーを受け取ります –

+0

ああ申し訳ありませんが、私は閉じ括弧(タプル用)または角括弧(リスト用)のいずれかを見逃し、編集を参照してください、今すぐ動作するはずです。それは本当にデータで何をしたいかによって異なりますが、タプルは不変ですが、リストはそうではありません。 – ifma

+0

Pythonを学ぶために、このWebページを強くお勧めします。他の言語に関する以前の知識があると仮定すると、Pythonのコードを非常に素早く書くことができます(タプル対リストなどの良い情報がたくさんあります):http://www.diveintopython.net/ toc/index.html – ifma

-1

:例は、良い習慣かもしれません。パラレル化は実際に計算を高速化するだけでなく、ここでのボトルネックはデータ転送です。

関連する問題