21

这是我的场景:

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

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

关于在我的场景中使用 celery 的最佳实践有什么建议吗?

4

2 回答 2

5

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'])
于 2015-03-27T20:48:54.410 回答
2

您可以在运行时将任务动态分配给队列,当调用它时,请参阅calling.html#routing-options。如果您已CELERY_CREATE_MISSING_QUEUES启用,这将起作用。

于 2013-09-12T07:51:39.480 回答