我有一个web应用程序,我试图使用芹菜从数据库加载后台任务。我目前正在根据请求加载数据库,但希望每小时加载一次任务,并让它们在后台工作。我正在使用烧瓶和我在python编码。我也有redis在运行。
到目前为止,使用芹菜,我已经让工人处理任务和节拍发送任务到工人的间隔。但是我想从工作者检索结果[数据框或查询],如果结果还没有准备好,那么它应该加载工作者的先前结果。
有什么好主意吗?
编辑
我正在使用sqlalchemy从数据库检索结果,并在网页中呈现结果。我有我的主页,其中有所有的各种链接,所有导致不同的图形,我想在后台加载,这样用户就不必等待很长的加载时间。
芹菜任务是由一个Worker执行,它的结果被存储在芹菜后端。
如果我理解对了,那么我认为你有几个选择:
- 忽略图形加载任务的结果,将需要的内容作为任务的副作用存储在数据库中。需要时,查询该数据库中的最新结果。如果DB是Redis,你可能会发现ZADD和ZRANGE合适。这样,如果可用,您将获得新的,如果没有,您将获得以前的。
-
如果您提供任务的id,则可以查找任务的结果。当你想要了解状态时,你可以这样做,比如(其中
celery
是芹菜应用程序):result = celery.AsyncResult(<the task id>)
-
当新的结果准备好时,使用回调来进一步更新。
- 让后台线程等待AsyncResult,或native_join,这是Redis支持的,并相应地更新(不推荐)
我个人在类似的情况下使用选项#1(使用MongoDB),发现它非常可维护和灵活。但可能,由于你的UI的性质,选项#3将更适合你的需要。