Python全系列 教程
3567个小节阅读:5929.5k
目录
鸿蒙应用开发
C语言快速入门
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
在很多情况下,一个任务需要由多个子任务或者一个任务需要很多步骤才能完成,Celery也能实现这样的任务,完成这类型的任务通过以下模块完成:
group: 并行调度任务
chain: 链式任务调度
chord: 类似group,但分header和body2个部分,header可以是一个group任务,执行完成后调用body的任务
文档:https://docs.celeryq.dev/en/latest/getting-started/next-steps.html#the-primitives
urls.py:
xxxxxxxxxx
path('primitive/', views.test_primitive),
views.py:
xxxxxxxxxx
def test_primitive(request):
# 创建10个并列的任务
lazy_group = group(tasks.add.s(i, i) for i in range(10))
promise = lazy_group()
result = promise.get()
return JsonResponse({'function': 'test_primitive', 'result': result})
说明
通过task函数的s方法传入参数,启动任务
上面这种方法需要进行等待,如果依然想实现异步的方式,那么就必须在tasks.py中新建一个task方法,调用group,示例如下:
tasks.py:
xxxxxxxxxx
@shared_task
def group_task(num):
return group(add.s(i, i) for i in range(num))().get()
urls.py:
xxxxxxxxxx
path('first_group/', views.first_group),
views.py:
xxxxxxxxxx
def first_group(request):
ar = tasks.group_task.delay(10)
return HttpResponse('返回first_group任务,task_id:' + ar.task_id)
默认上一个任务的结果作为下一个任务的第一个参数
xxxxxxxxxx
def test_primitive(request):
# 等同调用 mul(add(add(2, 2), 5), 8)
promise = chain(tasks.add.s(2, 2), tasks.add.s(5), tasks.mul.s(8))()
# 72
result = promise.get()
return JsonResponse({'function': 'test_primitive', 'result': result})
任务分割,分为header和body两部分,hearder任务执行完在执行body,其中hearder返回结果作为参数传递给body
xxxxxxxxxx
def test_primitive(request):
# header: [3, 12]
# body: xsum([3, 12])
promise = chord(header=[tasks.add.s(1,2),tasks.mul.s(3,4)],body=tasks.xsum.s())()
result = promise.get()
return JsonResponse({'function': 'test_primitive', 'result': result})
实时效果反馈
1. 关于Celery组装任务,说法错误的是?
A celery的任务只能一个一个的执行
B group函数是并行执行任务
C chain函数是链式执行任务
D chord函数用来分割任务的执行
答案
1=>A