python - celery 设计帮助 : how to prevent concurrently executing tasks

标签 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 等。

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

我认为一种可能的解决方案是将队列实现为用户存储桶,这样,当工作人员启动时,有一个配置指定要创建多少个存储桶,并且每个“存储桶工作人员”都绑定(bind)到一个存储桶。然后,“中间工作人员”将从主任务队列中提取任务,并通过哈希/模组方案将它们分配到分桶队列中。因此 UserA 的任务将始终在同一个队列中结束,而 UserA 的多个任务将相互备份。我不喜欢这种方法,因为它需要提前定义桶的数量,并且似乎会阻止(轻松地)动态添加工作人员。在我看来,一定有更好的方法 - 将不胜感激。

最佳答案

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

关于python - celery 设计帮助 : how to prevent concurrently executing tasks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811933/

相关文章:

python - sklearn 中的分类树给出不一致的答案

python - PEP8 不允许尝试除了阻止

python - 如何在 django View 中使用参数运行 scrapy 蜘蛛

python - 如何通过网络连接到 Rabbit-MQ 服务器?

Erlang AMQP 客户端库

python - celery 教程 : NotRegistered error

python - Python 中的 "name S_ISREG is not defined"

c# - 是否可以使用 RabbitMQ 和 gRPC 通过 .NET 对消息进行排队?

python - 是否可以控制 Celery 任务日志的 datefmt?

python - 如何在没有 Django 项目的情况下使用 djcelery.schedulers?