如何使烧瓶传递一个生成器任务,如芹菜



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

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

下面是一个示例代码,现在可以工作,但需要4秒的处理才能返回页面。

我正在寻找关于如何解决这个问题的建议,芹菜/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 '5n'
    def third_generator(self):
        time.sleep(1)
        yield '6n'
    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)

首先,不清楚"将生成器传递给芹菜"是什么意思。芹菜的全部要点是,它不直接链接到你的应用程序:它是一个完全独立的东西,甚至可能运行在一个单独的机器上,你会传递一些固定的数据。当然,你可以传递初始参数,让芹菜自己调用创建处理生成器的函数,但你不能把数据滴入到芹菜中。

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

相关内容

  • 没有找到相关文章

最新更新