15Django中使用celery之测试环境和正式环境
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函数 app.autodiscover_tasks(settings.INSTALLED_APPS)
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 res
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) send_sms_c.delay(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"}}'
备注:
让当前进程在后台运行,变成无敌,谁都干不死它
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代表输入,

浙公网安备 33010602011771号