重复使用芹菜任务的结果

时间:2015-01-04 22:49:08

标签: python celery

是否有任何常见的解决方案来存储和重用芹菜任务结果而无需再次执行任务?我在元搜索项目中有很多http获取任务,并且希望减少无用的http请求数量(它们可能需要很长时间并返回相同的结果)存储第一个的结果并在没有实际获取的情况下将其重新启动。此外,当相同的任务正在进行中时,不启动新的获取任务将非常有用。而不是运行新的作业应用程序必须返回已经挂起的任务的id(id是唯一的并由任务调用args生成)的AsyncResult。

看起来我需要为具有相同task_id的任务定义新的apply_asyncCelery.send_task)行为:

  1. 如果给定task_id的任务尚未启动,则启动它
  2. 如果已经开始给定task_id的任务返回AsyncResult(task_id)而没有实际运行任务
  3. @task装饰者应该接受新的ttl kwarg确定缓存时间(仅适用于redis后端?)

1 个答案:

答案 0 :(得分:3)

看起来最简单的答案是将结果存储在缓存(如数据库)中,然后首先从缓存中请求结果,否则触发http请求。

我认为芹菜没有特定的东西可以执行此操作。

修改

为了遵守您同时发送任务的事实,另外一件事就是为芹菜任务建立一个锁(参见Celery Task Lock receipt)。

在您的情况下,您希望为锁定一个包含任务名称和URL名称的名称。如果您的所有工作人员都可以看到您想要缓存的任何系统(在您的情况下是Redis?)