10

Python で小さな Web クローラーを作成しようとしていました。マルチスレッド スクリプトとして記述し、スレッドの 1 つのプールをダウンロードし、1 つのプールで結果を処理することを調査し始めていました。GILが原因で、実際に同時ダウンロードを行うのでしょうか? GIL は Web クローラーにどのように影響しますか? 各スレッドは、ソケットからデータを取得してから、次のスレッドに移動し、ソケットからデータを取得するなど..?

基本的に、Pythonでマルチスレッドクローラーを実行することで、シングルスレッドと比べて多くのパフォーマンスが得られるのでしょうか?

ありがとう!

4

5 に答える 5

8

ネットワーク操作を行うとき、GIL は Python インタープリターによって保持されません。(クローラーなどの) ネットワークに依存する作業を行っている場合は、GIL の影響を安全に無視できます。

一方、(ダウンロード後に) 処理を行うスレッドを多数作成する場合は、パフォーマンスを測定することをお勧めします。そこにあるスレッドの数を制限すると、パフォーマンスに対する GIL の影響が軽減されます。

于 2010-05-13T23:08:53.850 に答える
6

スクレイピーがどのように機能するかを見てください。それはあなたを大いに助けることができます。スレッドを使用しませんが、すべて同じスレッドで複数の「同時」ダウンロードを実行できます。

考えてみれば、ネットワーク カードは 1 枚しかないので、並列処理は定義上あまり役に立ちません。

スクレイピーが行うことは、あるリクエストの応答を待ってから別のリクエストを送信することではありません。すべて単一のスレッドで。

于 2010-05-13T23:16:30.133 に答える
1

別の考慮事項: 単一の Web サイトをスクレイピングしていて、サーバーが IP アドレスから送信できるリクエストの頻度に制限を設けている場合、複数のスレッドを追加しても違いはありません。

于 2010-05-13T23:18:46.870 に答える
1

クロールに関しては、非ブロックの非同期ソケット操作を使用してデータをフェッチして返す Twistedなどのイベントベースのものを使用した方がよい場合があります。

非同期ネットワーク操作は簡単に実行でき、通常はシングルスレッドです。ネットワーク I/O はほとんどの場合、CPU のレイテンシよりもレイテンシが高くなります。これは、ページが返されるまでにどれくらいかかるかわからないためです。非同期操作はスレッドよりもはるかに軽量であるため、ここで非同期が威力を発揮します。

編集:これは、 Twisted の getPage を使用して単純な Web クローラーを作成する方法の簡単な例です。

于 2010-05-13T23:19:51.737 に答える
0

はい、マルチスレッドスクレイピングはプロセス速度を大幅に向上させます。これは、GIL が問題になるケースではありません。リクエストが完了するのを待っていると、多くのアイドル状態の CPU と未使用の帯域幅が失われます。スクレイピングしている Web ページがローカル ネットワーク内にある場合 (まれなスクレイピングのケース)、マルチスレッドとシングル スレッドのスクレイピングの違いは小さくなる可能性があります。

1 から "n" のスレッドで遊んで、自分でベンチマークを試すことができます。Discovering Web Resourcesでシンプルなマルチスレッド クローラーを作成し、関連記事Automated Discovery of Blog Feeds and Twitter, Facebook, LinkedIn Accounts Connected to Business Websiteを書きました。FocusedWebCrawler の NWORKERS クラス変数を変更して、使用するスレッドの数を選択できます。

于 2012-10-25T17:54:08.563 に答える