我有一堆代码,我已正确使用烧瓶,但这些请求可能需要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)
答案 0 :(得分:3)
首先,它不清楚将发电机传递给Celery"它甚至意味着什么。 Celery的全部内容与您的应用程序没有直接关联:它是一个完全独立的东西,甚至可能在一台单独的机器上运行,您可以将一些固定数据传递给它。您当然可以传递初始参数并让Celery本身调用创建生成器进行处理的函数,但是您不能将数据滴加到Celery。
其次,在任何情况下,这都不适合Celery。 Celery用于离线处理。您无法将其返回到等待请求中。你唯一能做的就是让它将结果保存在Flask可以访问的地方,然后让你的模板激活一个Ajax请求,以便在它们可用时获得这些结果。