Python - Celery - 调用任务
前提
有3个任务:add作加法运算, mul作乘法运算, xsum为求和运算
1 |
|
立即执行任务
1 | add.apply_async() |
或者简写为:
1 | add.delay() |
延时任务
使用
countdown参数使任务在60秒后执行:
1 | add.apply_async(countdown=60) |
定时任务
使用
eta参数使任务在晚上9点整执行:
1 | import datetime |
任务分组
使用
group生成一组任务并发执行
1 | tasks = group(add.si(x,x) for x in range(10)) |
任务分块
使用
chord将1000个任务分成100个一块,共10组
1 | tasks = add.chunks(((x, x) for x in range(1000)), 100).group() # 转化为group |
链式顺序执行
任务签名
signature:
subtask=signature,可以简写为s,如add.s(),当需要对任务做一定处理后执行时使用。s和si的区别:s相当于signature(),而si相当于signature(immutable=True)。s会把上个任务的结果传给下个任务,而si不传递结果。
使用
chain按顺序执行一队任务:
1 | # 前一个任务的结果作为后一个任务的第一个参数 |
另一种调用方法:
1 | c = (add.s(4, 16) | mul.s(2) | (add.s(4) | mul.s(8))) # ((4 + 16) * 2 + 4) * 8 |
任务分割
使用
chord将任务分为header和body两部分,header任务执行完再执行body,其中header的返回结果会作为参数传递给body,如:
1 | res = chord(header=[add.s(1,2),mul.s(3,4)],body=add.s())() # 任务(1+2)+(3*4) |
当一个
group和另一个task组成chain时,会自动升级转化为chord,如:
1 | c = (group(add.s(i, i) for i in range(10)) | xsum.s()) # (0+0)+(1+1)+(2+2)+...+(9+9) |