如何使烧瓶通过发电机到芹菜这样的任务

时间:2014-08-23 15:33:18

标签: flask redis rabbitmq celery generator

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

由于这些任务需要30分钟或更长时间才能完成,我想卸载这些任务,但不知所措。我没有成功地获得芹菜/ 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)

1 个答案:

答案 0 :(得分:3)

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

其次,在任何情况下,这都不适合Celery。 Celery用于离线处理。您无法将其返回到等待请求中。你唯一能做的就是让它将结果保存在Flask可以访问的地方,然后让你的模板激活一个Ajax请求,以便在它们可用时获得这些结果。