本篇文章是 celery分布式任务队列从入门到精通_大帅的博客-CSDN博客 中的一个章节,其中celery的安装部署不再阐述,默认读者有django和celery的基础。
1. 简单的django项结构如下:
其中只定义了两个路由,taskA和taskB,在 view中实现了两个简单的方法
url.py路由部分如下:
urlpatterns = [
path('admin/', admin.site.urls),
path('taskA', func_A),
path('taskB', func_B),
]
views.py视图函数部分如下:
from django.http import HttpResponse
def func_A(request):
return HttpResponse("hello taskA!")
def func_B(request):
return HttpResponse("hello taskB!")
整个django项目十分简单,访问路由http://127.0.0.1:8000/taskA和taskB路由返回如下:
2. 创建celery工程
celery工程创建在django_demo工程目录下,
其中main.py主要用来初始化celery应用的,setting.py用来保存celery配置项,__init__.py保持为空即可,让整个目录成为一个可导入的python包。
其中还定义了两个任务模块:tasks_A 和 tasks_B
以下的目录中的代码
main.py
from celery import Celery
import os
# 让celery在启动时提前加载django配置文件,就可以使用django中的模块和变量了
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "django_demo.settings")
# 初始化app,导入任务
celery_app = Celery(
"celery_tasks",
include=["celery_tasks.tasks_A.tasks", "celery_tasks.tasks_B.tasks"]
)
# 初始化时,include的参数作用的导入任务,还有另一种方式自动发现注册任务
# celery_app.autodiscover_tasks(['celery_tasks.tasks_A', 'celery_tasks.tasks_B'])
# 加载配置
celery_app.config_from_object("celery_tasks.settings")
setting.py
# 设置时区
timezone = "Asia/Shanghai"
# 使用redis 作为消息代理
broker_url = 'redis://127.0.0.1:6379/0'
# 任务结果存在Redis
result_backend = 'redis://127.0.0.1:6379/0'
# 读取任务结果一般性能要求不高,所以使用了可读性更好的JSON
result_serializer = 'json'
tasks_A/tasks.py
from celery_tasks.main import celery_app
import time
@celery_app.task
def taskA():
time.sleep(3)
print("taskA")
tasks_B/tasks.py
from celery_tasks.main import celery_app
import time
@celery_app.task
def taskB(x, y):
time.sleep(3)
print("taskB")
return x + y
taskA函数也是十分简单,只是设置了阻塞3秒,并打印任务名称,没有返回值。taskB函数则是实现了两个数相加并返回之和
3. 在django工程中使用celery任务
修改views.py,导入celery的任务函数。修改如下
views.py
from django.http import HttpResponse
from celery_tasks.tasks_A.tasks import taskA # 导入任务
from celery_tasks.tasks_B.tasks import taskB
def func_A(request):
# 异步执行celery中的任务
# taskA函数中实现了time.sleep(3)阻塞3秒,但是这里不会阻塞,会立即返回hello taskA!
taskA.delay()
return HttpResponse("hello taskA!")
def func_B(request):
# 异步执行celery中的任务
taskB.delay(2,2)
return HttpResponse("hello taskB!")
启动django项目
python3 manage.py runserver 0.0.0.0:8000
启动celery的worker监视
因为这次我是在win10主机上运行celery,需要先安装两个python库
pip3 install redis eventlet
安装完后启动celery
celery -A celery_tasks worker -l info -P eventlet
启动成功如下图所示
验证: 打开浏览器,输入地址http://127.0.0.1:8000/taskA 和taskB的路由,可以发现立马就返回了结果,并不需要等待3秒,
再打开worker的终端查看,分别打印taskA, taskB,4,两个任务都成功执行了