【问题标题】:Is it possible to make grequests and requests_cache work together?是否可以让 grequests 和 requests_cache 一起工作?
【发布时间】:2014-03-14 13:47:24
【问题描述】:

看这段代码:

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

【问题讨论】:

    标签: python caching request python-requests gevent


    【解决方案1】:

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

    from requests import Session
    

    因此,grequests 从不使用修补过的会话对象。

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

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

    或者,创建一个CachedSession object 并将其作为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)
    

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

    【讨论】:

    • 好的,现在计时。使用不缓存的 grequests 获取 1k 个 URL 需要 43 秒。启用缓存后,第一次需要 180s,每次需要 25s。艰难的权衡...
    • @mnowotka:对,后端存储可能会受到并发访问的影响;例如,sqlite 使用线程锁。
    • 在这种情况下您建议使用哪一个?
    • 你可以试验fast_safe option,它设置PRAGMA synchronous = 0;然而,这不会消除线程锁。 memory 后端没有锁定,将其用作基线,然后还比较 redis 和 mongo 后端。我调整了模块以轻松使用 Memcached(在 Google App Engine 上),这也可能是一个选项。
    • 好的,信息已经足够了,现在我知道该怎么做了。非常有帮助的答案,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2021-12-03
    • 2010-11-21
    • 1970-01-01
    相关资源
    最近更新 更多