将celery并发设置为每个队列1个worker

时间:2011-07-07 00:39:52

标签: concurrency rabbitmq celery

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

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

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

由于 斯

2 个答案:

答案 0 :(得分:2)

为什么不使用memcache或nosql db简单地实现全局任务锁定系统? 通过这种方式,您可以避免任何竞争条件。

这是一个例子 http://ask.github.com/celery/cookbook/tasks.html#ensuring-a-task-is-only-executed-one-at-a-time

答案 1 :(得分:0)

与您问题的第一部分相关,我在此处提出并回答了类似的问题:Route to worker depending on result in Celery?

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