Python 重用芹菜任务的结果

Python 重用芹菜任务的结果,python,celery,Python,Celery,是否有任何通用的解决方案来存储和重用芹菜任务结果,而无需再次执行任务?我的metasearch项目中有许多http获取任务,我希望通过存储第一个http请求的结果并在不进行真正获取的情况下将其发回来减少无用http请求的数量(它们可能需要很长时间并返回相同的结果)。另外,当同一个任务已经在进行时,不启动新的获取任务也是非常有用的。除了运行新作业,应用程序还必须根据已挂起任务的id(id是唯一的,由任务调用参数生成)返回AsyncResult 看起来我需要为具有相同任务id的任务定义新的apply

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

看起来我需要为具有相同任务id的任务定义新的
apply\u async
cellery.send\u task
)行为:

  • 如果具有给定任务id的任务尚未启动,则启动它
  • 如果具有给定任务id的任务已启动,则返回AsyncResult(任务id),而不实际运行任务
  • @task
    decorator应该接受新的
    ttl
    kwarg确定缓存时间(仅适用于redis后端?)

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

    我不认为芹菜有什么特别的东西可以做到这一点

    编辑

    为了遵守任务同时发送的事实,另一件事是为芹菜任务构建一个锁(请参阅)


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

    这对于我问题的第一部分是正确的,但不回答第二部分。当我们还没有缓存时,如何处理同时启动的两(五,十)个任务(almoust)?我在寻找芹菜专用的解决方案,因为这是常见的任务机制。无论如何,谢谢。您还可以尝试锁定特定任务(使其仅可执行一次accross workers)=>例如,您可以调整此任务回执,您还可以将要调用的url添加到锁定名称=>。这将确保一次只运行一次调用给定URL的任务。然而,即使使用锁,在非常特定的情况下,您仍然可以有一些竞争条件,但我想在您的情况下,ping同一URL两次(每隔一段时间)并不是什么大问题。