【问题标题】:Celery chain's place of passing arguments芹菜链传递参数的地方
【发布时间】:2016-11-19 18:06:34
【问题描述】:

1) 芹菜链。

在我读到的文档上:

这是一个简单的链,第一个任务执行时将其返回值传递给链中的下一个任务,依此类推。

>>> from celery import chain

>>> # 2 + 2 + 4 + 8
>>> res = chain(add.s(2, 2), add.s(4), add.s(8))()
>>> res.get()
16

但是链项的结果到底是在哪里传递给下一个链项的呢?在 celery 服务器端,还是传给我的应用,然后我的应用传给下一个链项?

这对我很重要,因为我的结果非常大,可以将它们传递给应用程序,我想将所有这些消息传递到 celery 服务器中。


2) 芹菜组。

>>> g = group(add.s(i) for i in xrange(10))
>>> g(10).get()
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

我能否确定这些任务会尽可能多地一起执行。自组的第一个任务开始执行以来,celery 是否会优先考虑某个组?

例如,我有 100 个请求,每个请求运行一组任务,我不想在彼此之间混合来自不同组的任务。第一个开始处理的请求可以是最后一个完成的,而他的最后一个任务正在等待空闲的工作人员,这些工作人员正忙于其他请求的任务。一组任务尽可能一起执行似乎更好。


如果你能帮助我,我将不胜感激。

【问题讨论】:

    标签: celery


    【解决方案1】:

    1.芹菜链

    使用消息传递代理(例如rabbitmq)在芹菜端传递结果。结果使用结果后端存储(和弦执行明确需要)。您可以通过使用日志级别 'INFO' 运行 celery worker 来验证此信息,并确定如何调用任务。

    一旦你调用任务,Celery 就会维护dependency graph,所以它确切地知道如何链接你的任务。

    考虑将两个不同任务关联起来的回调,

    http://docs.celeryproject.org/en/latest/userguide/canvas.html#callbacks

    2。芹菜组

    当您在组 celery 中调用任务时,它们会并行执行(调用)。芹菜工人会根据可以承担的工作量来尝试接他们。如果您调用的任务数量超过您的工作人员可以处理的数量,那么您的前几个任务肯定会先执行,然后 celery 工作人员会逐渐选择休息。

    如果您的编号很大。要并行调用的任务最好在一定池大小的chunks 中调用,

    您可以提及answer中提到的任务的优先级

    小组任务的完成取决于每项任务需要多少时间。 Celery 尽量做到公平的任务调度。

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 2013-07-13
      • 2017-06-16
      • 2018-12-07
      • 2012-12-05
      • 2014-12-04
      • 1970-01-01
      • 2016-04-18
      相关资源
      最近更新 更多