django使用celery的步骤:

1创建celery配置文件编写初始化脚本
2在各自的应用下分别创建自己的tasks.py文件,用于集中定义对应worker函数
3视图函数充当生产者,推送具体worker函数
4项目目录下启动worker
celery -A 项目同名目录名 worker -l info

 示例:

1在项目同名目录下创建celery配置文件celery.py《与setting.py平级》

linuxTangblog
dtoken
linuxTangblog
__init__.py
asgi.py
celery.py
settings.py
urls.py
views.py
wsgi.py
media

2在celery.py中编写初始化:

from celery import Celery
from django.conf import settings
import os
#在linux环境变量里加一个特殊的环境变量,特殊变量DJANGO_SETTINGS_MODULE相当于key,而项目名称.settings相当于value
#其实就是告诉celery你要和项目linuxTangblog里的settings进行融合
os.environ.setdefault('DJANGO_SETTINGS_MODULE','linuxTangblog.settings')
#初始化celery,名字可以随便起,我就起一个和项目同名的名称
app = Celery('linuxTangblog')
#初始化配置
app.conf.update(
BROKER_URL = 'redis://:@127.0.0.1:6379/1'
)
#自动去注册应用下寻找加载worker函数

3在应用user下创建tasks.py:

linuxTangblog
dtoken
linuxTangblog
media
tools
user
migrations
__init__.py
admin.py
apps.py
models.py
tasks.py
tests.py
urls.py

4把user应用视图里编写的发送短信的方法粘贴到task.py里:

from linuxTangblog.celery import app
from django.conf import settings
from tools.sms import Yuntongxin
#发短信
@app.task
def send_sms_c(phone,code):
config = {
"accountSid": settings.SMS_ACCOUNT_SID,
"accountToken": settings.SMS_ACCOUNT_TOKEN,
"appId": settings.SMS_APPID,
"templateId": settings.SMS_TEMPLATEID,
}
yun = Yuntongxin(**config)
res = yun.run(phone, code)
return

5回到用户视图函数中把task.py里的函数send_sms_c引进来,然后用send_sms_c替换掉send_sms

from .tasks import send_sms_c
#发短信逻辑视图
def sms_view(request):
#发送随机码
#send_sms(phone,code)

6cmd进入到项目目录,确保能看到manage.py这个文件然后启动worker(D:\PycharmProjects\linuxTangblog)

D:\PycharmProjects>

D:\PycharmProjects>cd linuxTangblog

D:\PycharmProjects\linuxTangblog>celery -A linuxTangblog worker -l info -P eventlet

7在前端页面中发送验证码,并查看日志发现这条短信发送用了2.2秒,也就是说我们已经为django节省了2.2秒:

D:\PycharmProjects>cd linuxTangblog

D:\PycharmProjects\linuxTangblog>celery -A linuxTangblog worker -l info -P eventlet

-------------- celery@DESKTOP-041LA6S v5.2.1 (dawn-chorus)
--- ***** -----
-- ******* ---- Windows-10-10.0.19043-SP0 2021-12-15 08:43:35
- *** --- * ---
- ** ---------- [config]
- ** ---------- .> app: linuxTangblog:0x1c71de1ff10
- ** ---------- .> transport: redis://127.0.0.1:6379/1
- ** ---------- .> results: disabled://
- *** --- * --- .> concurrency: 8 (eventlet)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** -----
-------------- [queues]
.> celery exchange=celery(direct) key=celery


[tasks]
. user.tasks.send_sms_c

[2021-12-15 08:43:35,710: WARNING/MainProcess] D:\Program Files (x86)\Python\Python310\lib\site-packages\celery\app\utils.py:204: CDeprecationWarning:
The 'BROKER_URL' setting is deprecated and scheduled for removal in
version 6.0.0. Use the broker_url instead

deprecated.warn(description=f'The {setting!r} setting',

[2021-12-15 08:43:35,712: WARNING/MainProcess] Please run `celery upgrade settings path/to/settings.py` to avoid these warnings and to allow a smoother upgrade to Celery 6.0.
[2021-12-15 08:43:35,739: INFO/MainProcess] Connected to redis://127.0.0.1:6379/1
[2021-12-15 08:43:35,768: INFO/MainProcess] mingle: searching for neighbors
[2021-12-15 08:43:36,833: INFO/MainProcess] mingle: all alone
[2021-12-15 08:43:36,875: INFO/MainProcess] pidbox: Connected to redis://127.0.0.1:6379/1.
[2021-12-15 08:43:36,890: WARNING/MainProcess] D:\Program Files (x86)\Python\Python310\lib\site-packages\celery\fixups\django.py:203: UserWarning: Using settings.DEBUG leads to a memory
leak, never use this setting in production environments!
warnings.warn('''Using settings.DEBUG leads to a memory

[2021-12-15 08:43:36,891: INFO/MainProcess] celery@DESKTOP-041LA6S ready.
[2021-12-15 08:48:50,035: INFO/MainProcess] Task user.tasks.send_sms_c[1341333a-71c5-4e18-af5f-beec3a4efaa3] received
[2021-12-15 09:17:40,880: INFO/MainProcess] Task user.tasks.send_sms_c[a665e74e-73cb-4a4a-9e61-35802288d71d] received
[2021-12-15 09:17:42,123: INFO/MainProcess] Task user.tasks.send_sms_c[234df19e-4254-45cb-870e-020f9ec22112] received
[2021-12-15 09:17:42,149: INFO/MainProcess] Task user.tasks.send_sms_c[0b7660c0-ebe8-4ebf-938d-0538a80a69da] received
[2021-12-15 09:17:42,279: INFO/MainProcess] Task user.tasks.send_sms_c[1341333a-71c5-4e18-af5f-beec3a4efaa3] succeeded in 2.2030000000086147s: '{"statusCode":"000000","templateSMS":{"smsMessageSid":"07a3d1d9c1dc4dbdbd3ba292bbc085e4","dateCreated":"20211215091742"}}'

备注:

正式环境后台启动celery:

让当前进程在后台运行,变成无敌,谁都干不死它

nohup celery -A linuxTangblog worker -P gevent -c 1000 >celery.log 2>&1 &

名称解释:

-P gevent:celery有多种并发模式。默认情况下celery的并发是进程,但是python体系内最猛的并发是协程gevent,我们可以使用-P让celery以gevent的方式开协程,一旦开启后,每个进程里面会有指定数量的协程,然后并发的给你执行任务,这样可以提高效率

【> c e l e r y . log】:表示把日志输出到这个文件里

-c 1000:-c可以指定协程的数量,一般都设置为1000上下,这个值可能需要你结合自己的业务去测

nohup:linux命令,当前进程可以忽略所有SIGHUP挂断信号,也就是说无敌了,谁都干不死它

2>&1: 把标准错误输出重定向给了标准输出,言外之意就是日志文件里面既有错误输出,也有正常的输出记录。2代表的是错误输出,1代表的是标准输出,0代表输入,