Django与Celery是基于Python进行Web后端开发的核心搭配,在运营开发(即面向企业内部)的场景中非常常见。
下面是基于Django的Celery异步任务和定时任务的实战教程,大家觉得有用的话点个赞/在看吧!
1.配置Django Celery
配置celery主要有几点:
1. 在settings.py的同级目录下,创建celery.py文件(名字自己随意取),这个文件主要是用来生成celery的实例app.
from __future__ import absolute_import, unicode_literals import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NBAsite.settings') app = Celery('NBAsite',broker='redis://localhost:6379/0',backend='redis://localhost') app.config_from_object('django.conf:settings',namespace='CELERY') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
我们将 celery 实例的 broker 和 backend 都设为了redis.
其中 broker 的意思是“经纪人”,像股票经纪人一样,是用于促成“交易”的,Celery中它的职责就是给 worker 推送任务。
而backend的职责是存放执行信息和结果,这些数据需要被持久化存于数据库。但为了简化问题,我们将其与broker一样放置于redis当中。
2. 需要你在自己已经创建的app(不是celery的app,而是django项目的app)目录下面,创建task.py文件(这个文件名只能是这个)
因为Celery会统一从每个app下面的tasks里面监听任务。
3. 编写tasks.py的任务
看一下tasks内部的任务如何写:
from __future__ import absolute_import, unicode_literals from NBAsite.celery import app from celery import shared_task import time @shared_task def waste_time(): time.sleep(3) return "Run function 'waste_time' finished."
任务的目标是延迟3秒后,返回一个语句。
4. init.py中的设置
这个是非常关键的一点,如何让django在启动的时候,也把celery给启动了呢?
答案是在项目的init文件内,导入celery的app
from __future__ import absolute_import, unicode_literals import pymysql from .celery import app as celery_app pymysql.install_as_MySQLdb() __all__ = ('celery_app',)
2.Django 其他配置
为了能够触发该异步任务,我们接下来配置一些常规文件,views和url,首先是views函数:
from .tasks import waste_time def test_c(request): result = waste_time.delay().get() return JsonResponse({'status':'successful'})
然后是url:
path('test_c', test_c, name='test_c'),
3.进行测试
首先,运行django项目
python manage.py runserver
这样,django项目和celery的app就被一起启动了,但是这个时候是无法执行这个task的,因为worker没有被启动,我们可以试一下:
访问http://127.0.0.1:8000/stats/test_c
会得到以下报错:
正确的姿势是怎么样的?需要先激活worker,然后再访问API:
celery -A NBAsite worker -l info
从上图下方的log信息里可以看到,在延迟了3秒后,任务启动并返回字符串,而在页面上,也可以看到成功返回。
需要注意的是,如果你修改了tasks的内容,是需要重启celery才能生效的,最简单的方法就是重启django项目。
这样,我们就完成了简单的异步任务的配置和使用。
4.定时任务配置
在异步任务中,我们只用到了worker,而在定时任务中,还要用到celery的beat调度器。
首先来看下如何配置定时任务,或者说如何配置这个调度器。
还是在celery.py里面进行配置:
from __future__ import absolute_import, unicode_literals import os from celery import Celery from celery.schedules import crontab from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'NBAsite.settings') app = Celery('NBAsite',broker = 'redis://localhost:6379/0',backend='redis://localhost') app.config_from_object('django.conf:settings',namespace='CELERY') app.conf.beat_schedule ={ 'autosc':{ 'task':'stats.tasks.auto_sc', 'schedule':crontab(hour=20,minute=47), }, } app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
重点是增加了app.conf.beat_schedule这个定时任务配置,指定了 stats 文件夹下 tasks.py 中的auto_sc函数,定时于20:47分执行。
5.具体任务页面tasks
增加一个对应要做定时任务的task
@shared_task def auto_sc(): print ('sc test?') return 'halo'
6.运行命令和结果
命令的话可以将激活worker和激活beat合并在一起,如下:
celery -A NBAsite worker -B -l info
不过,windows不被允许这么使用,因此在windows环境下,你需要同时打开worker和beater:
celery -A NBAsite worker -l info celery -A NBAsite beat -l info
看上图下方的log可知定时任务被成功执行。
参考资料:
https://www.jianshu.com/p/173070bcdfaf
https://www.jianshu.com/p/ee32074a10de
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典