celery 进阶使用篇

516 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
一、前言
之前讲了 celery 的基本使用,这篇文章主要用于记录一些使用心得,涉及到的概念相对比较底层,面试时候也经常会问到这一块的内容。主要包括 4 个方面,celery worker 模式、celery 工作流、celery 任务调起常用参数、回调函数

二、celery worker 模式
为什么 worker 要有多种工作模式呢,因为异步任务类型也不一样,有的偏计算密集型,有的偏 IO 密集型。
一般 worker 的工作模式主要有三种,第一个种是 prefork,多进程模式,每启动一个 worker 就是多开启一个进程,使用于计算密集型的任务类型。第二种是 evenlet, 第三种是 gevent,这两种模式下 worker 是协程启动的,所以适用于 IO 密集型的异步任务。

三、celery 工作流
有的时候异步任务需要按照一定的顺序串行执行,这个时候就需要考虑 celery 的执行顺序了。我说一下自己所了解的 3 种工作流方式, group 工作组,chain 工作链, chord 复合任务
顾名思议,group 工作组就是一组任务,可以并行执行,chain 工作链就是可以实现工作任务按照一定顺序串行执行,chord 复合任务是因为有了一个回调函数,在一组任务并行执行之后,再串行执行回调函数,所以串并复合,同时也可以拿到各个并行任务的执行结果。

四、apply_async 常用参数

// apply_async 和 delay 参数功能一样,但是拥有更多参数功能,常用参数如下:
countdown (float): 接收到任务后,执行任务之前等待的时间(s)。
eta (~datetime.datetime): 使用 datetime 指定 Worker 接收到任务后,开始执行任务的精确时间
expires (float, ~datetime.datetime): 使用 datetime 指定 Worker 接收到任务后的任务过期时间,过期后则不再执行。
shadow (str): 重新指定消息代理的 connection。
retry (bool): .在消息代理 connection 失败或断开的情况下,重试任务发送。
retry_policy (Mapping):  任务重试发送策略。
queue (str, kombu.Queue):  指定任务储存队列。
priority (int): 设定队列优先级 0~9。
link (~@Signature):如果任务执行成功,则紧接着执行一系列任务签名。
link_error (~@Signature): 如果任务执行发生错误,则紧接着执行一系列任务签名。

五、回调函数
当异步任务执行完成之后,可以使用回调函数记录任务执行结果

import celery
 
class MyTask(celery.Task):
    # 任务失败时执行
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print('{0!r} failed: {1!r}'.format(task_id, exc))
    # 任务成功时执行
    def on_success(self, retval, task_id, args, kwargs):
        pass
    # 任务重试时执行
    def on_retry(self, exc, task_id, args, kwargs, einfo):
        pass
 
@task(base=MyTask)
def add(x, y):
    raise KeyError()