3

Python で比較的単純なクローラーを作成していますが、複数のページを同時にフェッチするために非同期ネットワーク ライブラリを使用したいと考えています。 ~1000/2000 の URL では、パフォーマンスが低下します (ほとんどの URL は異なるドメインからのもので、私はそれらをシャッフルしました)。Eventlet を使用してそのような数のページをクロールする最速の方法と、どのくらいの速度を得ることができますか? (フェッチ/秒のような速度)

次に例を示します。


urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
     "https://wiki.secondlife.com/w/images/secondlife.jpg",
     "http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]

import eventlet
from eventlet.green import urllib2

def fetch(url):

  return urllib2.urlopen(url).read()

pool = eventlet.GreenPool()

for body in pool.imap(fetch, urls):
  print "got body", len(body)
4

1 に答える 1

2

Spawning Web サーバーを使用して変換プロキシ サービスを作成しました。スポーンは内部でイベントレットを使用しています。サービスの目的は、レガシー XML API をモバイル アプリケーション (iPhone、Android など) に公開することでした。

http://pypi.python.org/pypi/Spawning/

1) サーバーは、urllib を使用して XML を出力する ISS バックエンド サービスを呼び出します。

2) Python は XML を読み取り、それを JSON に変換します。解析には lxml が使用され、出力用にコンパイルされたネイティブ C 拡張機能を備えた simplejson が使用されました

3) 結果の JSON がクライアントに送信されました

イベントレットのパフォーマンスは、8 つの仮想コアを備えたサーバーで 1000 リクエスト/秒を超える素晴らしいものでした。パフォーマンスは安定していました (ゼロ エラー %s)。待ち時間なし。プロセス数とプロセスごとのスレッドのバランスをとる必要があり、それぞれ 20 ~ 50 のスレッドを持つ 12 のプロセスを使用したと思います。

また、Twisted とその非同期ページ取得メソッドもテストしました。Twisted の場合、非常に多くのエラーが発生する前に、わずか 200 req/s のパフォーマンスしか得られませんでした。Twisted では、レイテンシーも急速に増大し始め、このアプローチは失敗に終わりました。

パフォーマンスは、認証などのすべてのファンキーな処理を行う複雑な JMeter スクリプトで測定されました。

ここで重要なのは、Spawning monkey-patches urllib が本質的に非常に非同期になる方法だったと思います。

于 2011-04-20T18:41:41.910 に答える