不断从芹菜工人检索结果

Kal*_*tan 8 python database celery

我有一个Web应用程序,我试图使用芹菜从数据库加载后台任务.我目前正在根据请求加载数据库,但是希望每小时加载一次任务并让它们在后台运行.我正在使用flask并在python中进行编码.我也运行了redis.

到目前为止,使用芹菜我已经让工人处理任务和节拍,以便在一定时间间隔内将任务发送给工人.但我想从工作者检索结果[数据帧或查询],如果结果没有准备好,那么它应该加载工作者的先前结果.

关于如何做到这一点的任何想法?

编辑

我正在使用sqlalchemy从数据库中检索结果,我将结果呈现在网页中.我有我的主页,其中包含所有各种链接,这些链接都会导致我想要在后台加载不同的图形,因此用户无需等待很长的加载时间.

cre*_*ips 8

Celery Task正在由Worker执行,它的结果存储在Celery后端.

如果我找到你的话,我认为你没有多少选择:

  1. 忽略图加载任务的结果,在数据库中存储您需要的任务,作为任务的副作用.需要时,查询该数据库中的最新结果.如果数据库是Redis,您可能会发现ZADDZRANGE合适.通过这种方式,您可以获得新的(如果可用),或者之前的新的.
  2. 如果您提供任务的ID,则可以查找任务结果.您可以在想要查找状态时执行此操作,例如(celeryCelery应用程序在哪里):result = celery.AsyncResult(<the task id>)

  3. 新结果准备就绪时,使用回调更新.

  4. 让后台线程等待 Redis支持的AsyncResult或native_join,并相应地更新(不推荐)

我个人在类似情况下使用选项#1(使用MongoDB),发现它非常易于维护和灵活.但是,由于您的UI的性质,选项#3将更适合您的需求.