2017-04-11 3 views
2

リクエストとlxmlを使用してPython 3で構築された非常に基本的なサイトマップスクレーパーがあります。目的は、特定のウェブサイトのURLのデータベースを構築することです。現在の動作は次のとおりです。各トップレベルのサイトマップをスクラップするために、私はセロリのタスクを起動します。このタスクでは、サイトマップが解析されて、sitemapindexurlsetかどうかがチェックされます。 Sitemapindexesは階層的に他のサイトマップを指していますが、urlsetsは終わりのURLを指しています - それらはツリーのリーフのようです。既存のコードにコルーチンの概念を適用しようとしています

サイトマップがsitemapindexと示されている場合、サブサイトマップを指す各URLは別のスレッドで処理され、最初からプロセスが繰り返されます。

サイトマップがurlsetであると識別された場合、そのURLはデータベースに保存され、この分岐は終了します。

私はコルーチン、asyncio、gevent、async/awaitなどについて読んできました。私の問題がこれらの技術を使って開発するのに適しているかどうか、あるいはパフォーマンスが向上するかどうかはわかりません。

私が読んだ限り、IO操作が実行されている間に実行をブロックしないようにするために、IO操作を処理するときには、コルーチンが役に立ちます。しかし、私はそれらが本質的にシングルスレッドであることを読んだので、例えばコードがIO操作からのXML応答の解析を開始するときに並列化がないことを理解しています。

のでesentiallyの質問があり、どのように私は、コルーチン/ asyncio/insert_similar_technologyを使ってこれを実装するだろうか?パフォーマンス面で恩恵を受けるだろうか?

編集:ちなみに、私はTwistedが特殊なサイトマップスパイダーを持っていることを知っています。

答えて

2

申し訳ありませんが、私はここにいくつかの考えを私は完全にあなたのコードがどのように機能するかを理解していない、しかし:

は、あなたのプログラムが複数のURLをダウンロードしますか?

この場合、asyncioを使用してプログラムがネットワークI/Oを待機する時間を短縮することができます。そうでなければ、asyncioはあなたを助けません。

あなたのプログラムはどのようにURLをダウンロードしますか?

一つ一つあれば、asyncioはあなたがはるかに速く、それらをつかむのに役立ちます。一方で、もしあなたがすでにそれらを並列に(例えば異なるスレッドで)つかんでいるなら、asyncioから多くの利益を得ることはできません。

私はhere asyncioについての私の答えを読むためにあなたをアドバイス。短いので、非同期コードを使用する理由と時期を理解するのに役立ちます。

関連する問題