Python 如何在django中运行30分钟的API调用

Python 如何在django中运行30分钟的API调用,python,django,sockets,python-requests,Python,Django,Sockets,Python Requests,在我的django应用程序中,我有一个由操作(重新发布操作)触发的函数,在点击重新发布端点后,该函数会被触发,通过另一个API调用检查其状态30分钟。该职能是: timeout = time.time() + 60 * 30 published_flag = False while time.time() < timeout: data = requests.get(apiUrl + dist_id).json()

在我的django应用程序中,我有一个由操作(重新发布操作)触发的函数,在点击重新发布端点后,该函数会被触发,通过另一个API调用检查其状态30分钟。该职能是:

timeout = time.time() + 60 * 30
        published_flag = False
    while time.time() < timeout:
                data = requests.get(apiUrl + dist_id).json()
                try:
                    published_flag = data['flags']
                    if published_flag:
                        break
                    else:
                        time.sleep(5)
                        continue
                except KeyError:
                    break
timeout=time.time()+60*30
已发布标志=False
while time.time()<超时:
data=requests.get(apirl+dist_id).json()
尝试:
发布的标志=数据['flags']
如果发布了\u标志:
打破
其他:
时间。睡眠(5)
持续
除KeyError外:
打破
此超时为30分钟,非常长。但30分钟是最糟糕的情况,此时标志状态将发生变化。此操作可触发多次(可按下多个重新发布按钮)。端点实际上超时,因为30分钟太长,端点无法工作。因此,我通过web套接字将数据推送到前端


有更聪明的方法吗?

正如埃尼克斯所写,你应该用芹菜。但是你不需要很多工人。实际上,不要在芹菜任务中调用
sleep
。您可以稍后再试。因此,每项任务都非常短,您只需要1-2名员工

@app.task(bind=True, max_retries=60*30/5)
def do_whatever(self, dist_id):
    data = requests.get(apiUrl + dist_id).json()
    if 'flags' not in data:
        self.retry(countdown=5)

我想你可以利用
芹菜
在后台移动缓慢的任务运行。并保持web套接字连接,以便在任务完成时通知客户端。但一次可能有6-7个重新发布操作。那么,对于每一项,我是否衡量了工人的数量?是的,你是有理由的。您可以查看
芹菜
教程