为芹菜任务重用结果

用户

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

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

  1. 如果具有给定任务标识的任务尚未启动,则启动它
  2. 如果具有给定任务标识的任务已经启动,则返回AsyncResult(task_id),而不实际运行任务
  3. @task装饰器应接受新的ttl kwarg确定缓存时间(仅针对redis后端?)在


已被浏览了2335次
更新日期: 2020-10-28 19:37:05
1 个回答
fefe Tyson

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

我不认为芹菜能起到这种作用。在

编辑

为了遵守任务同时被发送的事实,另一件事是为celery任务构建一个锁(参见Celery Task Lock receipt)。在

在您的例子中,您需要给锁一个包含任务名和url名的名称。如果所有的工作人员都能看到你想要的缓存系统,你可以使用它(你的例子中是Redis?)在

评论 - 2020年8月26日 20:27

最新Python问答

推荐Python问答