ピラミッドを使用して Web サイトを構築しており、他の Web サイトからデータを取得したいと考えています。の呼び出しが 50 回以上ある可能性があるためurlopen
、gevent を使用して速度を上げたいと考えました。
geventを使用してこれまでに得たものは次のとおりです。
import urllib2
from gevent import monkey; monkey.patch_all()
from gevent import pool
gpool = gevent.pool.Pool()
def load_page(url):
response = urllib2.urlopen(url)
html = response.read()
response.close()
return html
def load_pages(urls):
return gpool.map(load_page, urls)
実行すると次のようになりpserve development.ini --reload
ます。
NotImplementedError: gevent is only usable from a single thread
.
何よりも先にパッチを適用する必要があると読んだことがありますが、そのための適切な場所がどこにあるのかわかりません。また、これは保存固有の問題ですか? mod_wsgiに移行するときに、この問題を再度解決する必要がありますか? または、gevent なしでこのユースケース (単に urlopen) を処理する方法はありますか? リクエストの提案を見たことがありますが、ドキュメントで複数のページをフェッチする例を見つけることができませんでした。
更新 1:
私もこのSOの質問からイベントレットを試しました(このイベントレットの例からほぼ直接コピーされました):
import eventlet
from eventlet.green import urllib2
def fetch(url):
return urllib2.urlopen(url).read()
def fetch_multiple(urls):
pool = eventlet.GreenPool()
return pool.imap(fetch, urls)
しかし、私が電話するとfetch_multiple
、私は得ていますTypeError: request() got an unexpected keyword argument 'return_response'
更新 2:
以前の更新のTypeError
原因は、以前に gevent を使用してモンキーパッチを試み、pserve を適切に再起動しなかったことが原因である可能性があります。すべてを再起動すると、正常に動作します。学んだ教訓。