如何在没有线程或任务队列的情况下在Flask中运行后台作业

问题描述 投票:6回答:2

我正在使用Flask-restplus构建REST API。我的一个端点从客户端上传文件并运行一些分析。这项工作最多使用30秒。我不希望这项工作阻止主要进程。因此,端点将立即返回200或201的响应,该作业仍可以运行。结果将保存到数据库中,稍后将检索该数据库。

对于长期工作,我似乎有两种选择。

  1. 穿线
  2. 任务队列

线程相对简单。但问题是,Flask app的线程数有限制。在独立的Python应用程序中,我可以使用队列作为线程。但这是REST api,每个请求调用都是独立的。我不知道是否有办法维护全局队列。因此,如果请求超出了线程限制,它将无法获取更多请求。

使用Celery和Redis的任务队列可能是更好的选择。但这只是一个概念验证的事情,时间线有点紧张。使用Flask设置Celery,Redis并不容易,我在我的dev机器上遇到了很多麻烦。它将部署在AWS上,这有点复杂。

我想知道这个案子是否有第三种选择?

python multithreading flask queue celery
2个回答
4
投票

我强烈推荐使用你在帖子中提到的Celery。它完全是为这个用例而构建的。他们的文档确实非常丰富,网上的例子也不乏,可以帮助您快速启动和运行。

另外,我想说THIS将是你开始时的第一个优秀资源。


1
投票

Celery是解决这个问题的绝佳解决方案,我过去曾成功地使用它来管理每天数百万个工作。

唯一真正的缺点是最初的学习曲线和事情变坏时的调试复杂性(可能会发生,尤其是数百万个工作)。

如果您对托管解决方案持开放态度,可以查看Coherence API Language-Integrated Distributed Tasks

在完全公开中,它是我制作的产品,作为我项目中Celery的替代品。它比Celery起步相对简单,并且不需要您管理您的工作(或队列)基础结构。

© www.soinside.com 2019 - 2024. All rights reserved.