首页 > 解决方案 > 如何在 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

提前致谢。

标签: djangomultithreadingpython-requests

解决方案


推荐阅读