ずっと前に、同時要求を同時に発生させるためにマルチスレッド化したWebスパイダーを作成しました。それは私のPythonの青年期で、GILとそれがマルチスレッドコードに対して作成する関連の問題を知る前の数日間でした(つまり、ほとんどの場合、シリアル化されたものです!)...
このコードを作り直して、コードをより堅牢にし、パフォーマンスを向上させたいと思います。これを行うには、基本的に2つの方法があります。2.6以降の新しいマルチプロセッシングモジュールを使用する方法と、何らかのリアクター/イベントベースのモデルを使用する方法です。後者のほうがはるかに簡単で、エラーが発生しにくいので、後者を使用したいと思います。
質問は、どのフレームワークが私のニーズに最も適しているかに関するものです。以下は、私がこれまでに知っているオプションのリストです。
- Twisted:Python reactorフレームワークのおじいさん:複雑で少し膨らんでいるように見えます。小さなタスクのための急な学習曲線。
- Eventlet:で、みんなからリンデン・ラボ。これらの種類のタスクを対象としたGreenletベースのフレームワーク。私はコードを見てみましたが、あまりきれいではありません。pep8に準拠せず、印刷物が散在しています(なぜフレームワークでこれを行うのですか?)、APIは少し矛盾しています。
- PyEv:未熟です。libeventに基づいているため、現時点ではだれも使用しているようには見えないため、確実なバックエンドがあります。
- asyncore:stdlibから:非常に低レベルで、何かを実現するためだけに多くのレッグワークが必要なようです。
- tornado:これは動的Webサイトをサーバーするように設計されたサーバー指向の製品ですが、非同期HTTPクライアントと単純なioloopを備えています。それは仕事を成し遂げることができるように見えますが、それが意図したものではありません。[編集:残念ながらWindowsでは動作しません。これは、私にとってそれを数えます-私がこの不完全なプラットフォームをサポートするための要件です]
見逃したことはありますか?確かに、簡素化された非同期ネットワーキングライブラリのスイートスポットに合うライブラリがそこにあるはずです!
[編集:このページへのポインタを提供してくれたintgrに感謝します。一番下までスクロールすると、このタスクに何らかの形で取り組むことを目的としたプロジェクトの非常に優れたリストが表示されます。実際、Twistedの誕生以来、物事は実際に進んでいるようです。人々は、従来のリアクタ/コールバック指向のソリューションではなく、コルーチンベースのソリューションを好むようです。このアプローチの利点は、より明確で直接的なコードです。特に、boost.asioを使用している場合は、確かに過去に見つかりました。C ++では、コールバックベースのコードは、追跡が困難で、訓練されていない目からは比較的わかりにくい設計につながる可能性があります。コルーチンを使用すると、少なくとも少し同期が取れているように見えるコードを書くことができます。私の今の仕事は、これらの多くのライブラリのどれが私が見た目で気に入っているかを調べて試してみることです!私が今尋ねたのはうれしい...]
[編集:おそらく、この質問をフォローしたりつまずいたり、このトピックについて何らかの意味で気にかけている人にとって興味深いものです。この仕事に利用できるツールの現在の状態について、非常にすばらしい記事を見つけました]
select
I / O多重化に使用するため、パフォーマンスやスケーラビリティが劣るだけです。しかし、tornado-pyuvを使用すると、適切なパフォーマンスを得ることができるはずです。2. Python 3.3以降とそのバックポートトロリウスにasyncioが追加され、イベントループでTornadoアプリケーションを実行できるようになりました(Twistedはまもなくサポートされます)。