Win11系统下使用DjangoCelery异步任务队列以及
首先明确一点,celery4。1的官方文档已经详细说明,该版本之后不需要引入依赖djangocelery这个库了,直接用celery本身就可以了,就在去年年初的一篇文章python3。7。2Django2。0。4使用djangocelery遇到的那些坑,中提到的一些bug,在今年早已不复存在,所以技术更新频率越来越快,本文详细阐述用新版Celery(4。4。2)来实现。
关于celery的底层原理这里就不赘述了,简单的流程图就可以一图以蔽之
安装对应的库pip3installcelery4。4。2pip3installeventlet0。25。2pip3installDjango2。0。4
eventlet是一个高性能协程库,用来解决win10下celery进程的bug
配置settings。py文件:CELERYBROKERURLredis:localhost:6379CELERYRESULTBACKENDredis:localhost:6379CELERYRESULTSERIALIZERjson
这里broker配置redis,同时backend也就是任务结果也存到redis中,格式为json,方便读写。
在settings。py同级目录创建celery。pyfromfutureimportabsoluteimport,unicodeliteralsimportosfromceleryimportCelery设置环境变量os。environ。setdefault(DJANGOSETTINGSMODULE,mydjango。settings)注册Celery的APPappCelery(mydjango)绑定配置文件app。configfromobject(django。conf:settings,namespaceCELERY)自动发现各个app下的tasks。py文件app。autodiscovertasks()
注意mydjango为你当前的django项目名称
修改settings。py同级目录的init。py文件fromfutureimportabsoluteimport,unicodeliteralsfrom。celeryimportappasceleryapp导包importpymysql初始化pymysql。installasMySQLdb()all〔celeryapp〕
在应用中创建tasks。py文件fromcelery。taskimporttask自定义要执行的task任务taskdefprinttest():print(nicttry)returnhello
如果需要,也可以在settings。py里将该任务配置为定时任务(周期任务)fromcelery。schedulesimportcrontabCELERYBEATSCHEDULE{周期性任务taskone:{task:myapp。tasks。printtest,schedule:5。0,每5秒执行一次args:()}}
同时异步任务也可以通过django的视图进行在线调用frommyappimporttasksdefctest(request,args,kwargs):restasks。printtest。delay()任务逻辑returnJsonResponse({status:successful,taskid:res。taskid})
这里的delay方法就是异步方式请求,而非django默认的同步执行步骤
在manage。py的目录下启动celery服务celeryworkerAmydjangolinfoPeventlet
在浏览器中调用异步服务接口
同时也可以在backend中查询任务结果
注意一点,redis中的key并不是单纯的taskid,而是需要加上前缀celerytaskmeta
最后,如果需要启动定时任务,就需要在manage。py所在的文件夹内单独启动beat服务celeryAmydjangobeatlinfo
可以看到任务队列会每隔五秒执行一次定时任务
总体而言,Celery4。4。2解决了很多bug,比如著名的async关键字的问题,同时优化了性能,在eventlet协程库的加持下,更加如虎添翼,准入门槛也比以前低了不少。