不断从芹菜工人检索结果

时间:2016-09-07 19:33:28

标签: python database celery

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

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

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

修改

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

1 个答案:

答案 0 :(得分:8)

Celery Task正由一名工人执行,其结果存储在Celery Backend

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

    图加载任务的
  1. Ignore the result,在您的数据库中存储您需要的任务,作为任务的副作用。需要时,查询该数据库中的最新结果。如果数据库是Redis,您可能会发现ZADDZRANGE合适。通过这种方式,您可以获得新的,如果可用的话,或者先前的新的。
  2. 您可以查找result of a task if you provide it's id。您可以在想要查找状态时执行此操作,例如(celery是Celery应用程序):result = celery.AsyncResult(<the task id>)

  3. 使用callback在新结果准备就绪时更新。

  4. 让AsyncResult的后台线程wait或Redis支持的native_join,并相应地更新(不推荐)
  5. 我个人在类似情况下使用选项#1(使用MongoDB),发现它非常易于维护和灵活。但是,由于您的用户界面的性质,选项#3将更适合您的需求。