我有一堆代码,我在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请求来获取这些结果。