Django项目中使用Celery

本篇文章是 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,两个任务都成功执行了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大帅不是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值