Concurrency 将芹菜并发性设置为每个队列1个工作进程

Concurrency 将芹菜并发性设置为每个队列1个工作进程,concurrency,rabbitmq,celery,Concurrency,Rabbitmq,Celery,我基本上是使用芹菜中的rabbitmq队列作为穷人的同步。例如,当某些对象被更新时(并且成本很高),我会根据它们的对象ID将它们循环到一组10个队列中。首先,这是一种常见的模式还是有更好的方法 其次,对于celeryd,似乎并发级别选项(CELERY\u concurrency)设置了所有队列中的工作人员数量。这种方法不符合使用队列进行同步的目的,因为队列可以由多个工作人员提供服务,这意味着在同一对象上执行不同操作时可能存在竞争条件 有没有办法设置并发级别(或工作池选项),以便每N个队列有一个工

我基本上是使用芹菜中的rabbitmq队列作为穷人的同步。例如,当某些对象被更新时(并且成本很高),我会根据它们的对象ID将它们循环到一组10个队列中。首先,这是一种常见的模式还是有更好的方法

其次,对于celeryd,似乎并发级别选项(CELERY\u concurrency)设置了所有队列中的工作人员数量。这种方法不符合使用队列进行同步的目的,因为队列可以由多个工作人员提供服务,这意味着在同一对象上执行不同操作时可能存在竞争条件

有没有办法设置并发级别(或工作池选项),以便每N个队列有一个工作线程

谢谢
Sri

为什么不简单地通过使用memcache或nosql db实现全局任务锁定系统? 这样可以避免任何比赛条件

这里有一个例子

关于你问题的第一部分,我在这里提出并回答了一个类似的问题:


基本上,您可以根据密钥直接路由到工作者,在您的情况下,密钥是一个ID。它避免了对单个锁定点的任何需要。希望这是有用的,即使这个问题已经存在了2年:)

为了补充这一点,我希望避免使用不同配置运行多个celeryd实例(即每个实例都设置为CELERY_CONCURRENCY=1,并且只侦听10个队列的子集)。如果这是唯一的办法,那就糟糕了。嘿,毛罗,很好的例子。谢谢你。但有几个问题:1。当锁还没有被另一个线程释放时,这不会让工作线程处于空闲状态吗?我可以增加线程的数量,但这并不能真正解决问题,不是吗。2.我可以看到这种情况扩展到需要在整个系统中使用多个锁,这意味着增加了复杂性或增加了死锁。3.最后,我想避免外部依赖,只是为了获得正确的并发性。我可以看到memcache的一般用途,但这似乎是一个很长的用途。基本上,当你找到锁时,你可以做你想做的事情,你可以实现你自己的行为,你可以重试任务,或者让他失败,这样作品就可以继续接收其他任务。基本上,您要做的是为您的任务创建一个基类,该基类扩展芹菜.task并重写call方法和after_return方法。这样,您就不必在每个任务逻辑中编写锁行为。查看本演示文稿的第21-22张幻灯片,仅凭评论字符是不够的