Celery 结束芹菜工人的任务、时限、工作阶段或客户指示

Celery 结束芹菜工人的任务、时限、工作阶段或客户指示,celery,Celery,我是西芹新手,如果能为我尚未编写的工作人员提供一些设计模式(或示例代码)方面的帮助,我将不胜感激 以下是工人所需特征的说明 工人将运行一个任务,从一个无止境的源(生成器)收集数据 除非指示停止,否则辅助任务将从生成器一直运行 工作任务应在出现以下任何一个触发器时正常停止 它超过了以秒为单位的执行时间限制 它超过了无止境生成器循环的多次迭代 客户端发送一条消息,指示工作任务立即完成 下面是一些我认为需要如何处理触发场景1和2的sudo代码 我不知道的是如何从客户端发送“立即完成”信号,以及如何

我是西芹新手,如果能为我尚未编写的工作人员提供一些设计模式(或示例代码)方面的帮助,我将不胜感激

以下是工人所需特征的说明

  • 工人将运行一个任务,从一个无止境的源(生成器)收集数据
  • 除非指示停止,否则辅助任务将从生成器一直运行
工作任务应在出现以下任何一个触发器时正常停止

  • 它超过了以秒为单位的执行时间限制
  • 它超过了无止境生成器循环的多次迭代
  • 客户端发送一条消息,指示工作任务立即完成
  • 下面是一些我认为需要如何处理触发场景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()
    

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


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

    您可以使用revoke终止执行任务