看看这段代码:
import requests
import grequests
import requests_cache
requests_cache.install_cache('bla')
urls = [
'http://www.heroku.com',
'http://python-tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://kennethreitz.com'
]
rs = (grequests.get(u) for u in urls)
results = grequests.map(rs)
我希望在执行此操作后,我会在当前目录中找到bla.sqlite
文件并执行
results = grequests.map(rs)
将会更快,因为数据将从sqlite缓存中获取。不幸的是,这不是真的,文件根本没有创建,也没有加速。当我使用请求而不是grequest时,一切正常。所以问题是标题说:是否可以让grequest和requests_cache一起工作?如果是,那怎么办?
答案 0 :(得分:4)
requests_cache.install_cache()
功能修补程序requests.Session
,但您已导入grequests
,其中使用了:{/ p>
from requests import Session
因此,grequests
从不使用修补的会话对象。
在安装缓存后将导入移动到:
import requests_cache
requests_cache.install_cache('bla')
import grequests
或者,创建一个CachedSession
object并将其作为grequests.get()
参数传递给session
(和相关的)方法:
import grequests
import requests_cache
session = requests_cache.CachedSession('bla')
urls = [
'http://www.heroku.com',
'http://python-tablib.org',
'http://httpbin.org',
'http://python-requests.org',
'http://kennethreitz.com'
]
rs = (grequests.get(u, session=session) for u in urls)
results = grequests.map(rs)
考虑到缓存存储后端可能无法安全地处理corcurrent访问。例如,sqlite
后端使用线程锁,这可能会发生冲突。