是否有任何通用的解决方案可以在不再次执行任务的情况下存储和重用芹菜任务结果?我的元搜索项目中有许多 http fetch 任务,并希望通过存储第一个请求的结果来减少无用的 http 请求的数量(它们可能需要很长时间并返回相同的结果),并在没有真正获取的情况下将其触发。此外,当相同的获取任务已经在进行中时,不启动新的获取任务也将非常有用。而不是运行新的作业应用程序必须通过已挂起任务的 id 返回 AsyncResult(id 是唯一的,由任务调用参数生成)。
看起来我需要为具有相同task_id的任务定义新的apply_async
(Celery.send_task
)行为:
- 如果具有给定task_id的任务尚未启动,则启动它
- 如果具有给定task_id的任务已经启动,则返回 AsyncResult(task_id) 而没有实际运行任务
-
@task
装饰师应该接受新的ttl
kwarg 确定缓存时间(仅适用于 Redis 后端?
看起来最简单的答案是将结果存储在缓存中(如数据库),然后首先从缓存中请求结果,否则触发 http 请求。
我不认为芹菜有什么特定的东西可以做到这一点。
编辑:
为了遵守您同时发送任务的事实,另一件事是为芹菜任务构建一个锁(请参阅芹菜任务锁定收据)。
在您的情况下,您希望为锁指定一个包含任务名称和 url 名称的名称。而且,如果所有工作人员都可以看到,您可以使用任何您想要的系统进行缓存(在您的情况下是 Redis?