我正在使用金字塔建立一个网站,我想从其他网站获取一些数据。因为可能有 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
.
我已经读到我需要先修补猴子补丁,但我不确定合适的地方在哪里。另外,这是特定于 pserve 的问题吗?当我搬到mod_wsgi时,我需要重新解决这个问题吗?或者有没有办法在没有 gevent 的情况下处理这个用例(只是 urlopen)?我已经看到了有关请求的建议,但我在文档中找不到获取多个页面的示例。
更新1:
我还尝试了这个 SO question中的 eventlet (几乎直接从这个 eventlet示例中复制):
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 进行monkeypatch 并且没有正确重新启动 pserve。一旦我重新启动一切,它就可以正常工作。学过的知识。