6

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务...

 1 year ago
source link: https://v3u.cn/a_id_153
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)

首页 - Python/2020-05-26

    首先明确一点,celery4.1+的官方文档已经详细说明,该版本之后不需要引入依赖 django-celery 这个库了,直接用 celery 本身就可以了,就在去年年初的一篇文章python3.7.2+Django2.0.4 使用django-celery遇到的那些坑,中提到的一些bug,在今年早已不复存在,所以技术更新频率越来越快,本文详细阐述用新版Celery(4.4.2)来实现。

    关于celery的底层原理这里就不赘述了,简单的流程图就可以一图以蔽之

20200525170520_95686.jpg

    安装对应的库

pip3 install celery==4.4.2
pip3 install eventlet==0.25.2
pip3 install Django==2.0.4

    eventlet是一个高性能协程库,用来解决win10下celery进程的bug

    配置settings.py文件:

CELERY_BROKER_URL = 'redis://localhost:6379/'

CELERY_RESULT_BACKEND = 'redis://localhost:6379/'

CELERY_RESULT_SERIALIZER = 'json'

    这里broker配置redis,同时backend也就是任务结果也存到redis中,格式为json,方便读写。

    在settings.py同级目录创建celery.py

from __future__ import absolute_import, unicode_literals
import os
from 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_literals
from .celery import app as celery_app

#导包
import pymysql
#初始化
pymysql.install_as_MySQLdb()

__all__ = ['celery_app']

    在应用中创建tasks.py文件

from celery.task import task

# 自定义要执行的task任务
@task
def print_test():
print("nict try")
return 'hello'

    如果需要,也可以在settings.py里将该任务配置为定时任务(周期任务)

from celery.schedules import crontab
CELERY_BEAT_SCHEDULE = {
# 周期性任务
'task-one': {
'task': 'myapp.tasks.print_test',
'schedule': 5.0, # 每5秒执行一次
# 'args': ()
}
}

    同时异步任务也可以通过django的视图进行在线调用

from myapp import tasks

def 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

    在浏览器中调用异步服务接口

20200525170540_24225.png

    同时也可以在backend中查询任务结果

    

20200525180507_98737.png

    注意一点,redis中的key并不是单纯的task_id,而是需要加上前缀celery-task-meta-

    最后,如果需要启动定时任务,就需要在manage.py所在的文件夹内单独启动beat服务

celery -A mydjango beat -l info

    可以看到任务队列会每隔五秒执行一次定时任务

20200525180513_87319.png

    总体而言,Celery4.4.2解决了很多bug,比如著名的async关键字的问题,同时优化了性能,在eventlet协程库的加持下,更加如虎添翼,准入门槛也比以前低了不少。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK