Django异步任务之Celery

作者: 14e61d025165 | 来源:发表于2019-03-26 19:54 被阅读3次

    Celery

    celery 是一个用于实现异步任务的库, 在很多项目中都使用它, 它和 django 融合使用很完美. 使用 celery 可以在实现 http request请求返回 view 前做一些我们想做的而且耗时的事情而不会让用户等待太久
    环境

    django 版本 == 1.11.6

    celery 版本 == 3.1.25
    安装

    pip install django-celery
    pip install celery

    首先需要将 celery 添加到 django 项目的 settings 里, celery 任务和 django 需要一个 中间人(broker),,这里使用的是 django 自带的 broker, 但在生产中一般使用 rabbitmq, Redis 等,在 INSTALLED_APP 中需要添加 djcelery 和 kombu.transport.django, 还有 app 应用。

    • project/project/ settings.py:

    import djcelery

    djcelery.setup_loader()
    BROKER_URL = 'django://'

    INSTALLED_APP = (
    ...
    'app'
    'djcelery',
    'kombu.transport.django',
    )

    新建 celery.py 创建一个 celery 应用,并添加以下内容

    • project/project/ celery.py:

    相对路径导入, 防止导入 celery 时冲突

    from future import absolute_import
    import os
    from celery import Celery
    from django.conf import settings

    让 celery 能找到 django 项目

    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')

    创建一个 celery 应用

    app = Celery('project')

    导入配置

    app.config_from_object('django.conf:settings')

    自动发现 task

    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

    @app.task(bind=True)
    def debug_task(self):

    print('Request: {0!r}'.format(self.request))
    
    • project/project/ init.py:

    from future import absolute_import

    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

    在 django app 中添加任务,文件名必须是 tasks.py, 在普通 python 函数前加一个 @task() 装饰器就变成了 celery task
    -project/app/ tasks.py:

    from celery.task import task
    from time import sleep

    @task()
    def helloWorld():
    print 'helloWorld'
    sleep(10)
    print 'helloWorld'
    return 'helloCelery'

    这样,一个任务就创建成功了,只剩下在 view 中调用了
    -project/app view.py:

    from tasks.py import helloWorld

    def home():

    helloWorld.delay()
    
    return HttpResponse('helloCelery')
    

    最后

    python manage.py migrate

    相关文章

      网友评论

        本文标题:Django异步任务之Celery

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