django - 如何在 Django 中为 python 请求创建队列?
问题描述
REST API 服务有请求限制(比如每分钟最多 100 个请求)。在 Django 中,我试图允许用户访问此类 API 并实时检索数据以更新 SQL 表。因此存在一个问题,如果多个用户尝试访问 API,可能会超出请求的限制。
这是一个代码片段,作为我当前如何执行请求的示例 - 每个用户将添加他想要请求并运行request_engine().start(object_list)
以访问 API 的对象列表。我使用多线程来加速请求。我还允许通过对每个请求对象的请求数设置限制来重试失败的 API 请求upper_limit
。
据我了解,API 请求应该有一些队列。我预计必须有一个更优雅的解决方案,但是,我找不到任何类似的例子。如何使用 Django 实现/重写它以供多用户使用?
import requests
from multiprocessing.dummy import Pool as ThreadPool
N=50 # number of threads
upper_limit=1 # limit on the number of requests for a single object
class request_engine():
def __init__(self):
pass
def start(self,objs):
self.objs={obj:{'status':0,'data':None} for obj in objs}
done=False
while not done:
self.parallel_requests()
done=all(_['status']>upper_limit or _['status']==-1 for obj,_ in self.objs.items())
return dict(self.objs)
def single_request(self,request_obj):
URL = f"https://reqres.in/api/users?page={request_obj}"
r = requests.get(url = URL)
if r.ok:
res = r.json()
self.objs[request_obj]['status']=-1
self.objs[request_obj]['data']=res
else:
self.objs[request_obj]['status']+=1
def parallel_requests(self):
objs=[obj for obj,_ in self.objs.items() if _['status']!=-1 and _['status']<=upper_limit]
pool = ThreadPool(N)
pool.map(self.single_request, objs)
pool.close()
pool.join()
objs=[1,2,3,4,5,6,7,7,8,234,124,24,535,6,234,24,4,1,3,4,5,4,3,5,3,1,5,2,3,5,3]
result=request_engine().start(objs)
print([_['status'] for obj,_ in result.items()])
# status corresponds to the number of unsuccessful requests
# status=-1 implies success of the request
提前致谢。
解决方案
推荐阅读
- java - 智能横幅加载到全屏大小
- javascript - 解决超过 2 个按钮的功能的问题
- vue.js - 有没有办法在 vue-styleguidist 中显示一个类 mixin 道具?
- angular - 为什么我的数据没有填充到 Angular 材料表中
- sql - 连接单列中的行
- javascript - 在 javascript 中使用 typescript 值
- symfony - 试图获取当前不工作的令牌
- environment-variables - 如何获得 zsh 完成以像 bash 一样扩展环境变量?
- javascript - 如何模拟 AWS Lambda 调用
- redis - 有没有办法使用 Lua 仅在大于 Redis 中的 int 的哈希中使用 HGETALL 值?