私は、Python コードを実行してサードパーティ API から HTTP 経由でリアルタイム データを取得する Linux Web サーバーに取り組んでいます。データは MySQL データベースに入れられます。多数の URL に対して多数のクエリを実行する必要があり、高速に実行する必要があります (高速 = 優れている)。現在、HTTP ライブラリとして urllib3 を使用しています。これについて最善の方法は何ですか?複数のスレッドを生成し (そうであれば、いくつ?)、それぞれのクエリで異なる URL を取得する必要がありますか? これについてのご意見をお待ちしております - ありがとうございます!
3 に答える
多くが本当に必要な数よりも多い場合は、スレッドではなく非同期 io を使用してください。
GRequests を使用すると、Gevent で Requests を使用して、非同期 HTTP リクエストを簡単に作成できます。
import grequests
urls = [
'http://www.heroku.com',
'http://tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://kennethreitz.com'
]
rs = (grequests.get(u) for u in urls)
grequests.map(rs)
マルチスレッドとリクエストのパイプラインを使用する必要があります。たとえば、検索 -> 詳細 -> 保存
使用できるスレッドの数は、機器だけに依存しません。サービスが処理できるリクエストの数は? 実行できる同時リクエスト数はいくつですか? 帯域幅でさえボトルネックになる可能性があります。
一種のスクレイピングについて話している場合 - サービスはリクエストの特定の制限後にあなたをブロックする可能性があるため、プロキシまたは複数の IP バインディングを使用する必要があります.
私の場合、ほとんどの場合、Python スクリプトからラップトップで 50 ~ 300 の同時要求を実行できます。
Twistedの優れたアプリケーションのように思えます。Web ページのダウンロード方法など、Web 関連の例を次に示します。Twisted とのデータベース接続に関する関連する質問を次に示します。
Twisted は一度に複数のことを行うためにスレッドに依存していないことに注意してください。むしろ、協調的なマルチタスクアプローチが必要です。つまり、メイン スクリプトがリアクタを起動し、リアクタが設定した関数を呼び出します。リアクターが作業を続行するには、関数が制御をリアクターに戻す必要があります。