Celery设计帮助:如何防止并发执行任务

时间:2012-03-21 19:58:47

标签: python rabbitmq celery amqp

我是Celery / AMQP的新手,我正在尝试设计任务/队列/工人设计以满足以下要求。

我有多种类型的“每用户”任务:例如,TaskA,TaskB,TaskC。这些“每用户”任务中的每一个都为系统中的一个特定用户读/写数据。所以在任何给定的时间,我可能需要创建任务User1_TaskA,User1_TaskB,User1_TaskC,User2_TaskA,User2_TaskB等。我需要确保,对于每个用户,没有任何任务的两个任务类型并发执行。我想要一个系统,其中没有工作人员可以在执行User1_TaskB或User1_TaskC的同时执行User1_TaskA,但是当User1_TaskA正在执行时,不应阻止其他工作程序同时执行User2_TaskA,User3_TaskA等。

我意识到这可以使用某种外部锁定机制(例如,在DB中)实现,但我希望有一个更优雅的任务/队列/工作者设计可以工作。

我认为一种可能的解决方案是将队列实现为用户存储桶,这样,当工作人员启动时,配置会指定要创建的存储桶数量,并且每个“存储桶工作者”只绑定到一个存储桶。然后,“中间工作者”将从主任务队列中拉出任务,并通过例如散列/ mod方案将它们分配到分段队列中。因此,UserA的任务总是在同一个队列中,UserA的多个任务将相互支持。我不喜欢这种方法,因为它需要提前定义桶的数量,并且似乎阻止(轻松)动态添加工作者。在我看来,必须有一个更好的方式 - 建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

使用外部锁定机制有什么不好?它简单,直接,高效。您可以在Celery here中找到分布式任务锁定的示例。通过为每个用户创建一个锁来扩展它,你就完成了!