python - 为可以处理多个用户的 Flask 后端创建队列
问题描述
我正在创建一个机器人,它具有基于 Flask 和 React(在树莓派零上运行)的界面,供用户请求它执行任务。当用户请求任务时,我希望后端将其放入队列中,并让后端不断查看队列并逐个处理它。每个任务可能需要 15-60 秒,因此它们非常冗长。
目前我只是立即在运行 Flask 服务器的同一个 python 进程中执行任务,并从本地测试看起来我可以在两个不同的浏览器中访问 react 应用程序并同时请求任务,它看起来像树莓pi 正在尝试并行运行它们(根据我在打印日志中看到的内容)。
让多个用户去前端排队任务的最佳方式是什么?当多个用户访问 react 应用程序时,我假设他们都连接到后端的同一个实例。因此,只需向后端添加一个出队并用互斥锁保护它就足够了(使用互斥锁的pythonic方法是什么?)。还是这太简单了?我是否需要其他一些流程或方法来实现任务队列(例如写入/读取外部文件以充当队列)?
解决方案
一般来说,在 Python 中运行任务最流行的方法是使用Celery。它是一个 Python 框架,在单独的进程上运行,不断检查队列(如 Redis 或 AMQP)中的任务。当它找到一个时,它会执行它,并将结果记录到“结果后端”(再次像数据库或 Redis)。然后你让 Flask 服务器将任务推送到队列中。
为了通知用户,您可以使用 React 应用程序的轮询,它只是每 5 秒请求一次更新,直到您从结果后端看到任务已成功完成。一旦你看到,停止轮询并向用户显示通知。
如果应用程序变得足够大以至于需要它,您可以轻松地让多个工作进程并行运行。一般来说,你只需要记住让每个进程都做它需要做的事情:Flask 服务器应该响应 Web 请求,而 Celery 服务器应该处理任务。不是反过来。
推荐阅读
- javascript - 如何通过从复选框中应用多个过滤器来过滤对象数组?
- amazon-mws - 如何使用亚马逊 MWS Scratchpad 知道商户列表属于哪个 MarketplaceId?
- python - 如何将元素推送到 MongoDB 数据库中对象内的数组中?
- sql - Oracle SQL - 从最近三个 GRN 日期获取项目的最高 (Max) 价格 (Order By)
- c++ - C++中的多维数组和嵌套循环
- python - 如何在 Julia 语言中使用 SVM?
- sql-server - 如何获取当前日期的 ISO 年的第一个日期?
- python - 无法从“tensorflow.python.eager.context”导入名称“get_config”
- azure-load-balancer - Azure VM 对应用程序网关和其他非 http 端口使用单个 DNS 记录
- angular - 在 Angular 项目中使用 ng-sidebar 时出现问题