看看这个代码:

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缓存中获取。不幸的是,这不是真的,文件根本没有创建,也没有加速。当我使用grequests的请求时,一切都很好。所以问题是一个标题说:是否有可能让grequest和requests\u cache一起工作?如果是,怎么做?

最佳答案

requests_cache.install_cache()函数修补程序requests.Session,但您已经导入了grequests,它使用:

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后端使用线程锁,这很可能会发生冲突。

08-25 03:11