首页 > 解决方案 > 为可以处理多个用户的 Flask 后端创建队列

问题描述

我正在创建一个机器人,它具有基于 Flask 和 React(在树莓派零上运行)的界面,供用户请求它执行任务。当用户请求任务时,我希望后端将其放入队列中,并让后端不断查看队列并逐个处理它。每个任务可能需要 15-60 秒,因此它们非常冗长。

目前我只是立即在运行 Flask 服务器的同一个 python 进程中执行任务,并从本地测试看起来我可以在两个不同的浏览器中访问 react 应用程序并同时请求任务,它看起来像树莓pi 正在尝试并行运行它们(根据我在打印日志中看到的内容)。

让多个用户去前端排队任务的最佳方式是什么?当多个用户访问 react 应用程序时,我假设他们都连接到后端的同一个实例。因此,只需向后端添加一个出队并用互斥锁保护它就足够了(使用互斥锁的pythonic方法是什么?)。还是这太简单了?我是否需要其他一些流程或方法来实现任务队列(例如写入/读取外部文件以充当队列)?

标签: pythonreactjsflask

解决方案


一般来说,在 Python 中运行任务最流行的方法是使用Celery。它是一个 Python 框架,在单独的进程上运行,不断检查队列(如 Redis 或 AMQP)中的任务。当它找到一个时,它会执行它,并将结果记录到“结果后端”(再次像数据库或 Redis)。然后你让 Flask 服务器将任务推送到队列中。

为了通知用户,您可以使用 React 应用程序的轮询,它只是每 5 秒请求一次更新,直到您从结果后端看到任务已成功完成。一旦你看到,停止轮询并向用户显示通知。

如果应用程序变得足够大以至于需要它,您可以轻松地让多个工作进程并行运行。一般来说,你只需要记住让每个进程都做它需要做的事情:Flask 服务器应该响应 Web 请求,而 Celery 服务器应该处理任务。不是反过来。


推荐阅读