标签归档:异步任务

Django Celery 异步与定时任务实战教程

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实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典