zoukankan      html  css  js  c++  java
  • django集成celery

    Celery是一个基于分布式消息传递的开源异步任务队列,在django实际应用场景下,往往有一些较为耗时,但并不需要返回值的任务,

    例如发送邮件,更新我们自己的统计数据库,这时我们可以将这些任务交由celery管理,以加快网页返回。

    本文重点来讲解django+redis+celery的配置,为什么这么配置自行google,例如absolute_import的用处等,另外也可查看官方给出的django-celery配置实例

    django项目布局如下:

      proj              
        ├── proj             
        │   ├── __init__.py
        │   ├── settings.py
        │   ├── urls.py          
        │   └── wsgi.py        
        └── manage.py 
    

    1.  新建proj/proj/celery.py文件

    import os
    from celery import Celery
    from django.conf import settings
    
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')
    
    app = Celery('proj')
    
    # Using a string here means the worker will not have to
    # pickle the object when using Windows.
    app.config_from_object('django.conf:settings')
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))
    

      

    2.  在proj/proj/__init__.py 模块中导入这个 Celery 实例,以确保当 Django 启动时可以加载这个 app

    并且 @shared_task 装饰器也能使用。

    from .celery import app as celery_app
    
    __all__ = ['celery_app']
    

      

    3. settings.py配置

    # celery settings
    # Broker
    BROKER_URL = 'redis://127.0.0.1:6379/1'
    # Result
    # CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
    
    CELERY_ACCEPT_CONTENT = ['json']
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    

      

    4. 在各app下创建tasks.py文件,注意此处只能以tasks命名

    from celery import shared_task
    
    
    @shared_task
    def add(x, y):
        return x + y
    
    # pv uv 统计案例
    from django.db.models import F # 获取源数据
    
    from .models import Post
    
    @app.task
    def increase_pv(post_id):
        return Post.objects.filter(id=post_id).update(pv=F('pv')+1)
    

      

    5. views.py中引入即可

    from .tasks import add
    
    
    add.delay(*args)  

    6. 启动Worker

    在django项目根路径下,键入

    $ celery worker -A proj -l info

    -------------------------------------

    bug 记录,真实环境centos部署没有问题。

    环境 win10,celery==4.3.0,redis==3.2.1(celery版本要求redis>3.2.0)

    启动worker成功,但执行异步任务失败

    报ValueError: not enough values to unpack (expected 3, got 0)

    解决方式

    $ pip install eventlet
    
    $celery worker -A proj -l info -P eventlet
    
  • 相关阅读:
    ubuntu12.04 死机 卡屏 画面冻结解决方案
    Install Firefox 20 in Ubuntu 13.04, Ubuntu 12.10, Ubuntu 12.04, Linux Mint 14 and Linux Mint 13 by PPA
    ListView1.SelectedItems.Clear()
    android studio 下载地址
    jquery.slider.js jquery幻灯片测试
    jquery.hovermenu.js
    jquery.tab.js选项卡效果
    适配 placeholder,jquery版
    jquery.autoscroll.js jquery自动滚动效果
    将 Google Earth 地图集成到自己的窗体上的 简单控件
  • 原文地址:https://www.cnblogs.com/zenan/p/10689567.html
Copyright © 2011-2022 走看看