结束芹菜工人的任务,时间限制,工作阶段或客户指示

时间:2012-03-01 19:46:54

标签: celery

我是芹菜的新手,我很感激为我尚未写的工人设计模式(或示例代码)提供一些帮助。

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

  • 工作人员将运行一项任务,从无穷无尽的资源中收集数据。
  • 除非指示停止,否则工作人员任务将永远从发电机进行供电。

当发生任何一个以下触发器时,worker任务应该正常停止。

  1. 超过执行时间限制(秒)。
  2. 它超过了无限生成器循环的多次迭代。
  3. 客户端发送一条消息,指示工作人员任务立即完成。
  4. 以下是我认为我需要处理触发器方案1和2的一些sudo代码。

    我不知道的是我如何从客户端发送'立即结束'信号以及如何在工作人员任务中接收和执行该信号。

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

    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()
    

1 个答案:

答案 0 :(得分:1)

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

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

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