【问题标题】:End Celery worker task on, time limit, job stage or instruction from client结束芹菜工人的任务、时间限制、工作阶段或客户的指示
【发布时间】:2012-03-20 08:13:23
【问题描述】:

我是 celery 新手,如果我还没有写过设计模式(或示例代码),我将不胜感激。

以下是对工人所需特征的描述。

  • worker 将运行一项任务,该任务从无穷无尽的来源(生成器)收集数据。
  • 除非被指示停止,否则工作任务将永远从生成器中运行。

工作任务应在发生以下任一触发器时正常停止。

  1. 它超过了以秒为单位的执行时间限制。
  2. 它超过了无限生成器循环的迭代次数。
  3. 客户端发送消息指示工作任务立即完成。

以下是一些 sudo 代码,说明我认为我需要如何处理触发场景 1 和 2。

我不知道我如何从客户端发送“立即完成”信号,以及它是如何在工作任务中接收和执行的。

任何建议或示例代码将不胜感激。

from celery.task import task
from celery.exceptions import SoftTimeLimitExceeded

COUNTLIMIT = # some value sent to the worker task by the client

@task()
def getData():
    try:
        for count, data in enumerate(endlessGeneratorThing()):
            # process data here
            if count > COUNTLIMIT: # Handle trigger scenario 2
                clean_up_task_nicely()
                break 
    except SoftTimeLimitExceeded:  # Handle trigger scenario 1
            clean_up_task_nicely()

【问题讨论】:

标签: celery


【解决方案1】:

我对 revoke 的理解是它只在执行之前撤销任务。对于(3),我认为您想要做的是使用 AbortableTask,它提供了一种协作方式来结束任务:

http://docs.celeryproject.org/en/latest/reference/celery.contrib.abortable.html

在客户端你可以调用task.abort(),在任务端你可以轮询task.is_aborted()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-28
    • 2021-02-21
    • 2014-07-14
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 2020-10-07
    相关资源
    最近更新 更多