flask - 如何让 flask 将生成器传递给 celery 等任务

标签 flask redis rabbitmq celery generator

我有一堆代码可以在 Flask 中正确运行,但这些请求可能需要 30 多分钟才能完成。我正在使用链式生成器来使用我现有的代码和 yield 返回到浏览器。

由于这些任务需要 30 分钟或更长时间才能完成,我想卸载这些任务但不知所措。我还没有成功地让 celery/rabbitmq/redis 或任何其他组合正常工作,我正在寻找如何完成它以便我的页面立即返回并且我可以在后台检查任务是否完成。

这是目前可以使用的示例代码,但需要 4 秒的处理时间才能返回页面。

我正在寻找有关如何解决此问题的建议,celery/redis 或 rabbitmq 可以处理这样的生成器吗?我应该寻找不同的解决方案吗?

谢谢!

import time
import flask
from itertools import chain

class TestClass(object):
    def __init__(self):
        self.a=4

    def first_generator(self):
        b = self.a + 2
        yield str(self.a) + '\n'
        time.sleep(1)
        yield str(b) + '\n'

    def second_generator(self):
        time.sleep(1)
        yield '5\n'

    def third_generator(self):
        time.sleep(1)
        yield '6\n'

    def application(self):
        return chain(tc.first_generator(),
                     tc.second_generator(),
                     tc.third_generator())

tc = TestClass()

app = flask.Flask(__name__)

@app.route('/')
def process():
    return flask.Response(tc.application(), mimetype='text/plain')

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000, debug=True)

最佳答案

首先,“将生成器传递给 Celery”甚至意味着什么还不清楚。 Celery 的全部意义在于它没有直接链接到您的应用程序:它是一个完全独立的东西,甚至可能在单独的机器上运行,您可以将一些固定数据传递给它。您当然可以传递初始参数并让 Celery 本身调用创建生成器进行处理的函数,但您不能将数据滴灌给 Celery。

其次,在任何情况下,这都不是 Celery 的合适用途。 Celery 用于离线 处理。你不能让它返回等待请求的东西。您唯一可以做的就是让它将结果保存在 Flask 可访问的某个地方,然后让您的模板触发 Ajax 请求以在这些结果可用时获取这些结果。

关于flask - 如何让 flask 将生成器传递给 celery 等任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25463543/

相关文章:

docker - 如何在 Docker 容器中配置 rabbitmq.config?

java - 如何优雅地结束 spring @Schedule 任务?

crash - 断电后RabbitMQ无法启动

redis - 从 redis 排序集中,检索分数小于给定分数的最高值的排名

laravel - 永久缓存,包括服务器重启和 redis 到磁盘功能

python - Flask 中的 JSON 数据是字符串还是字典?

python - Gunicorn:尝试启动 Flask 服务器时无法在 'app' 中找到属性 'wsgi'

python - 如何在tornado中异步写入redis

python - 我无法使用 opencv 从字节读取图像

python - 使用 flask 查找jinja2模板中的数字总和