使用Celery创建动态队列

时间:2013-09-11 00:09:41

标签: python queue flask celery

这是我的情景:

当用户登录我的网站时,我会为给定用户排队一堆任务(通常每个任务需要100个msecs,每个用户有100个任务)。这些任务排队到默认的Celery队列,我有100个工作人员正在运行。我使用websockets来显示用户在后端完成任务时的实时进度。如果我只有1或2个用户活跃,那么生活就会很好。

现在,如果我有几个并发用户登录到我的站点,则后面的用户排在初始用户后面并且他们的任务会饿死(因为所有任务都会转到同一个队列)。我的想法是为每个用户创建一个动态队列以确保公平。但是根据Celery文档(http://docs.celeryproject.org/en/latest/userguide/routing.html#defining-queues),我似乎需要静态定义队列。

有关在我的场景中使用芹菜的最佳做法的任何建议吗?

2 个答案:

答案 0 :(得分:3)

http://docs.celeryproject.org/en/latest/userguide/workers.html#queues

celery -A proj control add_consumer foo -d worker1.local

使用app.control.add_consumer()方法可以动态完成相同的操作:

app.control.add_consumer('foo', reply=True)
[{u'worker1.local': {u'ok': u"already consuming from u'foo'"}}]

app.control.add_consumer('foo', reply=True,
destination=['worker1@example.com'])

答案 1 :(得分:1)

您可以在调用时动态地将任务分配给队列,参考calling.html#routing-options。 如果您启用了CELERY_CREATE_MISSING_QUEUES,这将有效。