Celery 在Django中的异步任务
看官方文档看了一半,看不太下去,因为没什么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