安装redis点击此连接
pip install celery
pip install eventlet
windows下使用celery需要先安装pip install eventlet 否则会报错
import celery
import time
broker = 'redis://127.0.0.1:6379/0'
backend = 'redis://127.0.0.1:6379/1'
cel = celery.Celery('tes', broker=broker, backend=backend)
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}】-发邮件任务')
from celery_task import func1, func2
relus1 = func1.delay('张三')
print(relus1.id)
relus2 = func2.delay('李四')
print(relus2.id)
celery -A celery_task worker --loglevel=info -P eventlet
终端输出:
[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项目根目录创建mycelery包(manage.py同级目录),目录结构如下
mycelery/
├── config.py
├── __init__.py
├── main.py
└── sms/
├── __init__.py
├── tasks.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'
任务模块必须写在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')
最后在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", ])
建议切换目录到mycelery根目录下启动
Windows下启动需要加 -P eventlet 命令
# Linux下启动
celery -A mycelery.main worker --loglevel=info
# Windows下启动
celery -A mycelery.main worker --loglevel=info -P eventlet
# _*_ 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}')
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'