首先要明确的是,celery 4.1+版本的官方文档已经详细说明了,在该版本之后,无需再引入依赖于django-celery库,直接使用celery本身即可。在去年年初的一篇文章中提到的python 3.7.2和django 2.0.4使用django-celery时遇到的一些问题,现今已不存在。技术更新速度越来越快,本文将详细介绍如何使用新版celery(4.4.2)来实现异步任务。
关于Celery的底层原理,这里就不再赘述了,简单的流程图可以一图概括:

安装相应的库:
pip3 install celery==4.4.2pip3 install eventlet==0.25.2pip3 install Django==2.0.4
eventlet是一个高性能的协程库,用于解决Windows 10下Celery进程的bug。
配置settings.py文件:
CELERY_BROKER_URL = 'redis://localhost:6379/'CELERY_RESULT_BACKEND = 'redis://localhost:6379/'CELERY_RESULT_SERIALIZER = 'json'
这里的broker配置使用了Redis,同时任务结果也存储在Redis中,格式为JSON,便于读写。
在settings.py同级目录下创建celery.py文件:
from __future__ import absolute_import, unicode_literalsimport osfrom celery import Celery设置环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mydjango.settings')
注册Celery的APP
app = Celery('mydjango')
绑定配置文件
app.config_from_object('django.conf:settings', namespace='CELERY')
自动发现各个app下的tasks.py文件
app.autodiscover_tasks()
注意,mydjango是你当前Django项目的名称。
修改settings.py同级目录下的init.py文件:
from future import absolute_import, unicode_literalsfrom .celery import app as celery_app导包
import pymysql
初始化
pymysql.install_as_MySQLdb()
all = ['celery_app']
在应用中创建tasks.py文件:
from celery.task import task自定义要执行的task任务
@taskdef print_test():print("nice try")return 'hello'
如果需要,也可以在settings.py中将该任务配置为定时任务(周期任务):
from celery.schedules import crontabCELERY_BEAT_SCHEDULE = {
周期性任务
'task-one': { 'task': 'myapp.tasks.print_test', 'schedule': 5.0, # 每5秒执行一次 # 'args': ()}}
同时,异步任务也可以通过Django的视图在线调用:
from myapp import tasksdef ctest(request, *args, **kwargs):res = tasks.print_test.delay()
任务逻辑
return JsonResponse({'status': 'successful', 'task_id': res.task_id})这里的delay方法是异步请求方式,而非Django默认的同步执行步骤。
在manage.py的目录下启动Celery服务:
celery worker -A mydjango -l info -P eventlet在浏览器中调用异步服务接口:
同时,也可以在backend中查询任务结果:
注意一点,Redis中的key并不是单纯的task_id,而是需要加上前缀celery-task-meta-。
最后,如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务:
celery -A mydjango beat -l info可以看到任务队列会每隔五秒执行一次定时任务:
总体而言,Celery 4.4.2解决了许多bug,例如著名的async关键字问题,同时优化了性能。在eventlet协程库的支持下,性能更加强大,入门门槛也比以前低了不少。
以上就是Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/20670.html
微信扫一扫
支付宝扫一扫