私は現在、基本的には以前に作成した単純な監視スクリプトを変更しています。
とりわけ、以下を含む辞書のリストを作成します
- ウェブサイトの URL
- 応答にかかった時間 (デフォルトでは [なし] に設定)
- 送り返されたデータ (デフォルトでは [なし] に設定)
リストから各 URL をクエリ (GET) し、「時間」フィールドと「データ」フィールドに関連データを入力します。
結果をデータベースに保存します。
スクリプトは以前は問題なく動作していましたが、監視する URL のリストが増えるにつれて、すべてのクエリを完了するのにかかる時間が長くなりすぎました。
私の解決策は、スクリプトを変更して URL を同時にフェッチすることです。これを行うために、私はeventletを使用することにしました。これは、ドキュメントのこの例が、私が望んでいることをほぼ正確に実行するためです。
問題は、URL のリストに辞書が含まれているため、リストpool.imap()
を反復処理するために使用できないことです。(私の知る限りでは)
Eventlet のドキュメントには、GreenPile オブジェクトを使用してジョブを生成する別の同様の例* があり、それを使用して URL フェッチ機能を起動できるようですが、このスレッドの結果を取得できないようです。
ここに私のテストコードがあります:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import eventlet
from eventlet.green import urllib2
urls = [{'url': 'http://www.google.com/intl/en_ALL/images/logo.gif', 'data': None},
{'url': 'http://www.google.com', 'data': None}]
def fetch(url):
return urllib2.urlopen(url).read()
pool = eventlet.GreenPool()
pile = eventlet.GreenPile(pool)
for url in urls:
pile.spawn(fetch, url['url']) #can I get the return of the function here?
#or
for url in urls:
url['data'] = ??? #How do I get my data back?
#Eventlet's documentation way
data = "\n".join(pile)
私が理解している限りpile
、イテラブルであるため、イテレートできますが、インデックスを介してコンテンツにアクセスできません。これは正しいですか?
では、どのように (それは可能ですか?)urls
リストに直接入力できますか? 別の解決策は、URLの「フラット」リスト、URL、応答時間、およびデータを含む別のリストを作成pool.imap()
し、最初のリストで使用して2番目のリストにそれを入力することですが、辞書のリストを保持したい.
※このアカウントでは 3 つ以上のリンクを投稿することはできません。イベントレット ドキュメントの「デザイン パターン - ディスパッチ パターン」ページを参照してください。