是否可以使grequests和request_cache一起工作?

mno*_*tka 4 python caching request gevent python-requests

看下面的代码:

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)
Run Code Online (Sandbox Code Playgroud)

我希望执行此操作后,我将bla.sqlite在当前目录中找到文件并执行

results = grequests.map(rs)
Run Code Online (Sandbox Code Playgroud)

因为数据将从sqlite缓存中获取,所以速度会更快。不幸的是,这是不正确的,根本没有创建文件,也没有加速。当我使用grequests insetead的请求时,一切正常。因此,问题是标题说:可以使grequest和request_cache一起工作吗?如果是的话,如何?

Mar*_*ers 5

requests_cache.install_cache()功能的补丁requests.Session,但你已经进口grequests,其中用于:

from requests import Session
Run Code Online (Sandbox Code Playgroud)

因此,grequests切勿使用修补的会话对象。

安装缓存后,将导入移动到:

import requests_cache
requests_cache.install_cache('bla')
import grequests
Run Code Online (Sandbox Code Playgroud)

或者,创建一个CachedSession对象并将其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)
Run Code Online (Sandbox Code Playgroud)

考虑到缓存存储后端可能无法安全处理并发访问。在sqlite后端使用一个线程锁,例如,它很可能会发生冲突。