0. 前提
有3个任务:add作加法运算, mul作乘法运算, xsum为求和运算
1 |
|
1. 立即执行任务
1 | add.apply_async() |
或者简写为:
1 | add.delay() |
2. 延时任务
使用
countdown
参数使任务在60秒后执行:
1 | add.apply_async(countdown=60) |
3. 定时任务
使用
eta
参数使任务在晚上9点整执行:
1 | import datetime |
4. 任务分组
使用
group
生成一组任务并发执行
1 | tasks = group(add.si(x,x) for x in range(10)) |
5. 任务分块
使用
chord
将1000个任务分成100个一块,共10组
1 | tasks = add.chunks(((x, x) for x in range(1000)), 100).group() # 转化为group |
6. 链式顺序执行
任务签名
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 |
7. 任务分割
使用
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) |