Celery-异步

一、创建一个简单的celery任务

1.安装依赖

安装redis点击此连接

pip install celery
pip install eventlet 

windows下使用celery需要先安装pip install eventlet 否则会报错

2.引用函数库

import celery
import time

3.配置celery参数

broker = 'redis://127.0.0.1:6379/0'
backend = 'redis://127.0.0.1:6379/1'

cel = celery.Celery('tes', broker=broker, backend=backend)

4.创建异步函数-celery_task.py

import celery

broker = 'redis://127.0.0.1:6379/0'
backend = 'redis://127.0.0.1:6379/1'

cel = celery.Celery('tes', broker=broker, backend=backend)

@cel.task
def func1(name):
    print(f'执行给用户-【{name}】-发短信任务')


@cel.task
def func2(name):
    print(f'执行给用户-【{name}】-发邮件任务')

5.添加任务-produce_task.py

from celery_task import func1, func2

relus1 = func1.delay('张三')
print(relus1.id)

relus2 = func2.delay('李四')
print(relus2.id)

6.启动框架

celery -A celery_task  worker --loglevel=info -P eventlet

7.执行添加任务文件

终端输出:

[2022-05-17 02:02:29,106: INFO/MainProcess] Task celery_task.func1[138b374e-7d3a-4e83-840e-4e6250d64901] received
[2022-05-17 02:02:29,107: WARNING/MainProcess] 执行给用户-【张三】-发短信任务
[2022-05-17 02:02:29,113: INFO/MainProcess] Task celery_task.func2[0fb50ee9-b345-4600-b2b4-58c88ee4dbd3] received       
[2022-05-17 02:02:29,114: WARNING/MainProcess] 执行给用户-【李四】-发邮件任务
[2022-05-17 02:02:29,122: INFO/MainProcess] Task celery_task.func1[138b374e-7d3a-4e83-840e-4e6250d64901] succeeded in 0.014999999999417923s: '张三-OK'
[2022-05-17 02:02:29,123: INFO/MainProcess] Task celery_task.func2[0fb50ee9-b345-4600-b2b4-58c88ee4dbd3] succeeded in 0.0s: '李四-OK'

二、Django中使用Celery

1.在django项目根目录创建celery包:

在django项目根目录创建mycelery包(manage.py同级目录),目录结构如下

mycelery/
├── config.py
├── __init__.py
├── main.py
└── sms/
    ├── __init__.py
    ├── tasks.py

2.配置config.py文件:

# _*_ coding:utf-8 _*_
# @Time      : 2022/5/8 21:23
# @Author    : Chen
# @File      : config.py
# @IDE       : PyCharm

broker_url = 'redis://127.0.0.1:6379/15'
result_backend = 'redis://127.0.0.1:6379/14'

3.定义任务文件tasks.py–模拟发送短信:

任务模块必须写在tasks.py中

# _*_ coding:utf-8 _*_
# @Time      : 2022/5/8 21:24
# @Author    : Chen
# @File      : tasks.py
# @IDE       : PyCharm
from mycelery.main import app
import time
import logging

log = logging.getLogger("django")


@app.task
def send_sms(phone):
    time.sleep(5)
    print(f'给手机号为: {phone}发送短信完成')
    return 'OK'

# 执行一下,测试短信模块有没有问题
if __name__ == '__main__':
	send_sms('114')

4.配置main.py主程序

最后在main.py主程序中对django的配置文件进行加载

# _*_ coding:utf-8 _*_
# @Time      : 2022/5/8 21:23
# @Author    : Chen
# @File      : main.py
# @IDE       : PyCharm
# 主程序
import os

from celery import Celery

# 创建celery实例对象
app = Celery("DJ-CELERY")

# 把celery和django进行组合,识别和加载django的配置文件

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'celeryPros.settings.dev')

# 通过app对象加载配置
app.config_from_object("mycelery.config")

# 加载任务
# 参数必须必须是一个列表,里面的每一个任务都是任务的路径名称["任务1","任务2"]
app.autodiscover_tasks(["mycelery.sms", ])


5.启动Celery的命令

建议切换目录到mycelery根目录下启动
Windows下启动需要加 -P eventlet 命令

# Linux下启动
celery -A mycelery.main worker --loglevel=info 
# Windows下启动
celery -A mycelery.main worker --loglevel=info -P eventlet

6.Django视图调用:

# _*_ coding:utf-8 _*_
# @Time      : 2022/5/8 20:41
# @Author    : Chen
# @File      : index.py
# @IDE       : PyCharm
import time

from mycelery.sms.tasks import send_sms
from django.shortcuts import render, HttpResponse

def index(request):
    phone = request.GET['phone']
    # 打印接收到的电话号码
    # print(phone)
    # 调用异步任务
    res = send_sms.delay(phone)
    print(f"任务ID: {res.id}")
    return HttpResponse(f'返回: {phone}')

7.调用接口测试异步任务是否成功:

import requests
from concurrent.futures import ThreadPoolExecutor

def func(number):
    url = f'http://127.0.0.1:8000/index/?number={number}'
    res = requests.get(url)
    print(res.text)

if __name__ == '__main__':
    func('1234567')

调用接口返回输出:

返回: 1234567

Django终端输出:

任务ID: 63651204-f2f8-4292-bf39-57087aa4a626
[17/May/2022 01:56:15] "GET /index/?number=1234567 HTTP/1.1" 200 15

celery终端输出:

[2022-05-17 01:53:38,662: WARNING/MainProcess] 给手机号为: 1234567发送短信完成
[2022-05-17 01:53:38,678: INFO/MainProcess] Task mycelery.sms.tasks.send_sms[0442992d-affa-408a-842e-9a0b419b5c94] succeeded in 5.01600000000326s: 'OK'
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值