Celery 在Django中的异步任务

2019-07-14  本文已影响0人  AllenBigBear

看官方文档看了一半,看不太下去,因为没什么demo跟着练,所以网上直接搜索了别人的使用方式,自己来练习下。

1:如何配置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')
#下面这个设置就是对所有django的app进行监听
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

(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

pymysql.install_as_MySQLdb()

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

#其实加不加入__all__我觉得无所谓,反正都要启动的
__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
celery -A NBAsite worker -l info

运行成功

下面的worker的log信息里可以看到,在延迟了3秒后,任务启动并返回字符串,而在页面上,也可以看到成功返回。

最后,需要注意的是,如果你修改了任何tasks的内容,如果要生效的话,是需要重启celery的,最简单的方法就是重启django项目,就ok。

参考资料:
http://yshblog.com/blog/163
https://juejin.im/post/5b588b8c6fb9a04f834655a6
http://docs.celeryproject.org/en/latest/django/first-steps-with-django.html#using-celery-with-django

上一篇下一篇

猜你喜欢

热点阅读