【问题标题】:Create dynamic queues with Celery使用 Celery 创建动态队列
【发布时间】:2013-09-14 20:37:09
【问题描述】:

这是我的场景:

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

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

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

【问题讨论】:

  • 动态队列不会打败排队的对象吗?每个用户有 100 个任务听起来很多。不能将这些组合在一起,以便工作人员同时拉取所有用户任务吗?这样,用户将有一个专门的工作人员用于登录过程。是否所有登录任务都需要同步运行?
  • @JoeDoherty - 我不明白动态队列将如何击败排队对象。但是,您将所有每个用户任务作为一项大任务批处理的建议非常有趣,并且肯定会缓解我的问题 - 谢谢!不过,从设计的角度来看,我试图让大量工作人员执行小/快速任务(相对于长时间运行的任务)。不过,我仍然有兴趣查看是否有动态创建队列的选项 - 即使我批处理用户任务,我也可以看到这很有用。
  • @JoeDoherty - 关于“所有登录任务是否需要同步运行” - 答案是“否”。要求是它们都在合理的时间内完成,因为用户正在等待网站上完成任务的结果。
  • 我忘记了用户正在等待每个完成。而且我错误地考虑了可以解决您问题的动态队列。您可以将它们全部批处理,然后在每个阶段完成后报告,类似于this

标签: python queue flask celery


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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'])
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 2014-02-11
      • 2022-12-15
      • 2015-06-16
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多