美文网首页
Celery 在Django中的异步任务

Celery 在Django中的异步任务

作者: AllenBigBear | 来源:发表于2019-07-14 14:11 被阅读0次

    看官方文档看了一半,看不太下去,因为没什么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

    相关文章

      网友评论

          本文标题:Celery 在Django中的异步任务

          本文链接:https://www.haomeiwen.com/subject/atpbkctx.html