zoukankan      html  css  js  c++  java
  • Django异步任务之Celery

    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
  • 相关阅读:
    ASP的URL重写技术 IIS的ISAPI
    关于如何去勾引百度谷歌的蜘蛛爬虫
    如何让百度和google的蜘蛛爬虫迅速爬过来
    本机不安装Oracle客户端,使用PL/SQL Developer和 Instant Client 工具包连接oracle 11g远程数据库
    Java小知识点总结
    Tomcat启动分析(我们为什么要配置CATALINA_HOME环境变量)
    OracleDBconsoleorcl无法启动解决方案
    Java中PreparedStatement的错误使用
    Oracle 中行列转换问题总结
    Java中 Interger 的自动装箱
  • 原文地址:https://www.cnblogs.com/peng104/p/10580720.html
Copyright © 2011-2022 走看看