gpt4 book ai didi

python - 如何使 requests_cache 与许多并发请求一起工作?

转载 作者:太空狗 更新时间:2023-10-29 21:59:20 24 4
gpt4 key购买 nike

我正在获取并缓存(为了性能)很多 URL,例如:

import requests
import requests_cache
from multiprocessing.pool import ThreadPool

urls = ['http://www.google.com', ...]
with requests_cache.enabled():
responses = ThreadPool(100).map(requests.get, urls)

但是,我遇到了很多错误:

sqlite3.OperationalError: database is locked

显然有太多线程同时访问缓存。

requests_cache也是如此支持某种事务,以便仅在所有线程完成后才进行写入?例如

with requests_cache.enabled():
with requests_cache.transaction():
responses = ThreadPool(100).map(requests.get, urls)

最佳答案

我有一个 Django-Rest-Framework 应用程序。它工作得很好,直到请求同时进来。发生这种情况时,应用程序有时会开始抛出 database is locked 错误。我的第一个猜测是,Django-db 重载了,需要用更强大的东西替换。

通过使用来自 bash ( see here ) 的 curl 运行并行请求来重现问题给了我新的日志和跟踪。我发现 requests-cache 在清理其数据库时遇到问题。它被配置为缓存 600 秒,因此填充缓存后的第一次批处理总是会失败:

...
File "/opt/app/lib/python3.5/site-packages/requests_cache/core.py" in remove_expired_responses
159. self.cache.remove_old_entries(datetime.utcnow() - self._cache_expire_after)

File "/opt/app/lib/python3.5/site-packages/requests_cache/backends/base.py" in remove_old_entries
117. self.delete(key)

File "/opt/app/lib/python3.5/site-packages/requests_cache/backends/base.py" in delete
83. del self.responses[key]

File "/opt/app/lib/python3.5/site-packages/requests_cache/backends/storage/dbdict.py" in __delitem__
130. self.table_name, (key,))

Exception Type: OperationalError at /app/v1/invitations/
Exception Value: database is locked

在研究可能的解决方案时,我发现 Redis 可以用作后端。我安装了 Redis 并只为本地主机运行它。只需将缓存配置的 backendsqlite 设置为“redis”即可解决问题。

我感觉有点像是在用锤子修理一个松动的 bolt ,但我很高兴我没有破坏任何东西就可以正常工作。我相信有人能够找到更好、更优雅的解决方案,例如通过 requests-cache 或代码修复传递 sqlite-config-param。

关于python - 如何使 requests_cache 与许多并发请求一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41435295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com