python之celery使用详解(二)
python之celery使用详解(二)
前面我们了解了celery的基本使用后,现在对其常用的对象和方法进行分析。
Celery对象
任何被task修饰的方法都会被创建一个Task对象,变成一个可序列化并发送到远程服务器的任务;它有多种修饰方式:
- 使用默认的参数
@celery.task
def function_name():
pass
- 指定相关参数
@celery.task(bind=True, name='name')
def function_name():
pass
# task方法参数
name:可以显式指定任务的名字;默认是模块的命名空间中本函数的名字。
serializer:指定本任务的序列化的方法;
bind:一个bool值,设置是否绑定一个task的实例,如果绑定,task实例会作为参数传递到任务方法中,可以访问task实例的所有的属性,即前面反序列化中那些属性
base:定义任务的基类,可以以此来定义回调函数,默认是Task类,我们也可以定义自己的Task类
default_retry_delay:设置该任务重试的延迟时间,当任务执行失败后,会自动重试,单位是秒,默认3分钟;
autoretry_for:设置在特定异常时重试任务,默认False即不重试;
retry_backoff:默认False,设置重试时的延迟时间间隔策略;
retry_backoff_max:设置最大延迟重试时间,默认10分钟,如果失败则不再重试;
retry_jitter:默认True,即引入抖动,避免重试任务集中执行;
# 当bind=True时,add函数第一个参数是self,指的是task实例
@task(bind=True) # 第一个参数是self,使用self.request访问相关的属性
def add(self, x, y):
try:
logger.info(self.request.id)
except:
self.retry() # 当任务失败则进行重试
- 自定义Task基类
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()
#方法相关的参数
exc:失败时的错误的类型;
task_id:任务的id;
args:任务函数的参数;
kwargs:键值对参数;
einfo:失败或重试时的异常详细信息;
retval:任务成功执行的返回值;
Task的一般属性
调用异步任务有三个方法,如下:
task.delay():这是apply_async方法的别名,但接受的参数较为简单;
task.apply_async(args=[arg1, arg2], kwargs={key:value, key:value}):可以接受复杂的参数
send_task():可以发送未被注册的异步任务,即没有被celery.task装饰的任务;
1. app.send_task
delay方法是apply_async方法的简化版,不支持执行选项,只能传递任务的参数。
@app.task
def add(x, y, z=0):
return x + y
add.delay(30,40,z=5) # 包括位置参数和关键字参数
3. Task.apply_async
由于celery发送的都是去其他进程执行的任务,如果需要在客户端监控任务的状态,有如下方法:
r = task.apply_async()
r.ready() # 查看任务状态,返回布尔值, 任务执行完成, 返回 True, 否则返回 False.
r.wait() # 会阻塞等待任务完成, 返回任务执行结果,很少使用;
r.get(timeout=1) # 获取任务执行结果,可以设置等待时间,如果超时但任务未完成返回None;
r.result # 任务执行结果,未完成返回None;
r.state # PENDING, START, SUCCESS,任务当前的状态
r.status # PENDING, START, SUCCESS,任务当前的状态
r.successful # 任务成功返回true
r.traceback # 如果任务抛出了一个异常,可以获取原始的回溯信息
但是一般业务中很少用到,因为获取任务执行的结果需要阻塞,celery使用场景一般是不关心结果的。
使用celery
-
http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-options
-
http://docs.jinkan.org/docs/celery/getting-started/first-steps-with-celery.html
-
http://www.pythondoc.com/flask-celery/first.html
-
https://blog.csdn.net/kk123a/article/details/74549117
-
https://blog.csdn.net/preyta/article/details/54288870