私はポーランド語のブロゴスフィア監視 Web サイトを開発しており、Python で大量のコンテンツのダウンロードを処理する「ベスト プラクティス」を探しています。
ワークフローのサンプル スキームを次に示します。
説明:
RSS フィード (約 1000) のデータベースを分類しました。新しいアイテムが投稿されていないかどうか、約 1 時間ごとにフィードをチェックする必要があります。もしそうなら、私はそれぞれの新しいアイテムを分析する必要があります. 分析プロセスは、各ドキュメントのメタデータを処理し、内部にあるすべての画像をダウンロードします。
コードの単純化された 1 スレッド バージョン:
for url, etag, l_mod in rss_urls:
rss_feed = process_rss(url, etag, l_mod) # Read url with last etag, l_mod values
if not rss:
continue
for new_item in rss_feed: # Iterate via *new* items in feed
element = fetch_content(new_item) # Direct https request, download HTML source
if not element:
continue
images = extract_images(element)
goodImages = []
for img in images:
if img_qualify(img): # Download and analyze image if it could be used as a thumbnail
goodImages.append(img)
そのため、RSS フィードを反復処理し、新しいアイテムを含むフィードのみをダウンロードします。フィードから各新しいアイテムをダウンロードします。アイテム内の各画像をダウンロードして分析します。
HTTR リクエストは次の段階で表示されます: - RSS xml ドキュメントのダウンロード - RSS で見つかった x 個のアイテムのダウンロード - 各アイテムのすべての画像のダウンロード
複数の URL コンテンツのダウンロードを処理するために、python gevent (www.gevent.org) ライブラリを試すことにしました。
結果として得たいもの: - 外部 http リクエストの数を制限する機能 - リストされたすべてのコンテンツ アイテムを並列ダウンロードする機能。
それを行う最善の方法は何ですか?
私は並列プログラミングにまったく慣れていないため(この非同期要求はおそらく並列プログラミングとはまったく関係がないため)、成熟した世界でそのようなタスクがどのように行われるかまだわかりません。
私の頭に浮かんだ唯一のアイデアは、次の手法を使用することです。 - cronjob を介して 45 分ごとに処理スクリプトを実行します。ロックに失敗した場合は、プロセス リストでこの pid を確認します。pid が見つからない場合は、プロセスが何らかの時点で失敗した可能性があり、新しいプロセスを安全に開始できます。- rss フィード ダウンロード用の gevent プール実行タスクのラッパーを介して、すべての段階 (新しいアイテムが見つかった) で新しいジョブを quique に追加してアイテムをダウンロードし、ダウンロードされたすべてのアイテムで画像ダウンロード用のタスクを追加します。- 現在実行中のジョブの状態を数秒ごとに確認し、FIFO モードで空きスロットがある場合は quique から新しいジョブを実行します。
私には問題ないように聞こえますが、おそらくこの種のタスクには「ベスト プラクティス」があり、私は今車輪を再発明しています。そのため、ここに質問を投稿しています。
どうも!