当前位置: 代码迷 >> python >> 是否可以使grequests和requests_cache一起工作?
  详细解决方案

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

热度:77   发布时间:2023-07-14 08:43:12.0

看看这段代码:

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时,一切正常。 所以问题是标题说: 是否可以使grequests和requests_cache一起工作? 如果是,怎么样?

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

from requests import Session

因此, grequests永远不会使用修补的会话对象。

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

import requests_cache
requests_cache.install_cache('bla')
import grequests

或者,创建一个并将其作为session参数传递给grequests.get() (和相关的)方法:

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

  相关解决方案