zoukankan      html  css  js  c++  java
  • django -- Celery实现异步任务

    1. 环境

    python==2.7
    
    djang==1.11.2  # 1.8, 1.9, 1.10应该都没问题
    
    celery-with-redis==3.0  # 需要用到redis作为中间人服务(Broker)
    celery==3.1.25  # 安装上面的会自动安装
    kombu==3.0.37
    billiard==3.3.0.23
    
    django-celery==3.2.2  # celery插件, 实现定时任务
    

    celery>=4.0 不支持windows, 具体参考官方文档

    2. 安装

    pip install django==1.11.2 celery-with-redis==3.0 django-celery==3.2.2
    

    3. 安装Redis, 用作Broker (RabbitMQ 官方推荐, 但安装麻烦点)

    教程很多, 略
    

    4. 新建django项目

    官方文档

    - Demo
      - Demo
        setting.py
        wsgi.py
        urls.py
      - app
        - migrations
        models.py
        views.py
        ...
    
    • 配置settings.py
    INSTALLED_APPS = (
        ...
        'app',
        'djcelery',# django-celery 可以在admin后台定义定时任务, 开始前需要直接migrate
    )
    
    
    BROKER_URL = 'redis://127.0.0.1:6379/0'
    BROKER_TRANSPORT = 'redis'
    
    CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'  # 数据库调度
    
    
    • 新建文件Demo/Demo/celery.py
    from __future__ import absolute_import
    
    import os
    
    from celery import Celery
    
    # set the default Django settings module for the 'celery' program.
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Demo.settings')
    
    from django.conf import settings  # noqa
    
    app = Celery('Demo')
    
    # 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))
    
    
    • 新建Demo/app/tasks.py
    from Demo.celery import app
    
    @app.task
    def cus_task(*arg):
        print('This is a test task')
    
    • 编辑Demo/app/views.py
    from django.shortcuts import render, HttpResponse
    
    from .tasks import cus_task
    
    
    def index(request):
        cus_task.delay()
        return HttpResponse("Test async task")
    
    • 启动djangocelery
    # django
    python manage.py runserver
    
    # celery
    celery -A Demo worker -l debug
    

    admin后台中配置celery计划

    • 配置
    # 如上settings.py中的设置, 后执行
    python manage.py migrate djcelery
    
    • 登陆admin后台进行配置
    # Djcelery模块列表
    
    Crontabs  # 同linux crontab
    Intervals  # 间隔
    Periodic tasks  # 周期任务
    Tasks
    Workers
    
    

    配置一个periodic task任务内容 app.tasks.cus_taskcrontabinterval设置每5s执行一次

    • 启动django和celery, 并查看日志
    celery -A Demo worker -l debug
    
    # 另一个窗口
    celery -A Demo beat -l debug --max-interval=10  # 每10s扫描一次djcelery任务
    

    补充

    • [ ] 安装flower
    pip install flower
    
    • [ ] 启动flower(默认启动一个webserver:5555)
    python manage.py celery flower
    
    • [ ] 浏览器打开 http://localhost:5555查看具体
    夜来风雨声, 代码码多少?
  • 相关阅读:
    POJ 1659 Frogs' Neighborhood
    zoj 2913 Bus Pass(BFS)
    ZOJ 1008 Gnome Tetravex(DFS)
    POJ 1562 Oil Deposits (DFS)
    zoj 2165 Red and Black (DFs)poj 1979
    hdu 3954 Level up
    sgu 249 Matrix
    hdu 4417 Super Mario
    SPOJ (BNUOJ) LCM Sum
    hdu 2665 Kth number 划分树
  • 原文地址:https://www.cnblogs.com/belic/p/8987687.html
Copyright © 2011-2022 走看看