リクエストとlxmlを使用してPython 3で構築された非常に基本的なサイトマップスクレーパーがあります。目的は、特定のウェブサイトのURLのデータベースを構築することです。現在の動作は次のとおりです。各トップレベルのサイトマップをスクラップするために、私はセロリのタスクを起動します。このタスクでは、サイトマップが解析されて、sitemapindex
かurlset
かどうかがチェックされます。 Sitemapindexesは階層的に他のサイトマップを指していますが、urlsetsは終わりのURLを指しています - それらはツリーのリーフのようです。既存のコードにコルーチンの概念を適用しようとしています
サイトマップがsitemapindex
と示されている場合、サブサイトマップを指す各URLは別のスレッドで処理され、最初からプロセスが繰り返されます。
サイトマップがurlset
であると識別された場合、そのURLはデータベースに保存され、この分岐は終了します。
私はコルーチン、asyncio、gevent、async/awaitなどについて読んできました。私の問題がこれらの技術を使って開発するのに適しているかどうか、あるいはパフォーマンスが向上するかどうかはわかりません。
私が読んだ限り、IO操作が実行されている間に実行をブロックしないようにするために、IO操作を処理するときには、コルーチンが役に立ちます。しかし、私はそれらが本質的にシングルスレッドであることを読んだので、例えばコードがIO操作からのXML応答の解析を開始するときに並列化がないことを理解しています。
のでesentiallyの質問があり、どのように私は、コルーチン/ asyncio/insert_similar_technologyを使ってこれを実装するだろうか?パフォーマンス面で恩恵を受けるだろうか?
編集:ちなみに、私はTwistedが特殊なサイトマップスパイダーを持っていることを知っています。