• 五分钟看懂Celery定时任务


    Django下使用Celery

    使用场景:

    1, Web应用。 当用户触发的一个操作需要很长时间才能执行完成,那么就可以把它当做一个任务去交给Celery去异步执行, 执行完成之后再返回给用户,这短时间用户不需要等待响应处理的过程, 反而提高了网站吞吐量和响应时间。

    2, 定时任务,生产环境经常会跑一些定时任务,假如你有成千上万台服务器,上千种任务, 定时任务的管理很困难,Celery可以帮助我们快速的在不同的机器设定不同种的任务。

    3, 同步完成的附加工作都可以异步完成,比如:发送短信/邮件、消息推送、清理/设置缓存等。

    特性:

    1, 方便地查看定时任务的执行情况,比如是否执行成功,当前状态,执行任务花费时长等。

    2, 可以使用功能齐备的管理后台或者命令行添加,更新,删除任务等。

    3, 方便把任务和配置管理相关联。

    4, 可选多进程, Eventlet和Gevent三种模式并发执行。

    5, 提供错误处理机制。

    6, 提供多种任务原语,方便实现任务分组,拆分和调用链。

    7, 支持多种消息代理和存储后端。

    Celery的使用

    pip install django
    
    pip install django-celery

    以上两个依赖安装完成之后就开始编写代码吧。

    创建Dajngo工程

    django-admin.py startproject dc_test       # 创建工程
    
    django-admin.py stratapp projectmanageapp      # 创建app

    创建完工程之后, 打开dc_test/dc_test/settings.py  

    INSTALLED_APPS = (
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'demo',
        'djcelery'           # 添加  djcelery应用
    )        
    from datetime import timedelta
    
    
    CELERYBEAT_SCHEDULE = {
        'add-every-30-seconds': {
            'task': 'demo.tasks.hello_world',
            'schedule': timedelta(seconds=2),
        },
    }

    添加完成之后,在同级目录下,创建Celery.py 文件

    from __future__ import absolute_import, unicode_literals
    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', 'dc_test.settings')
    
    app = Celery('dc_test')
    
    # Using a string here means the worker don't have to serialize
    # the configuration object to child processes.
    # - namespace='CELERY' means all celery-related configuration keys
    #   should have a `CELERY_` prefix.
    app.config_from_object('django.conf:settings')
    
    # Load task modules from all registered Django app configs.
    app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
    
    
    @app.task(bind=True)
    def debug_task(self):
        print('Request: {0!r}'.format(self.request))

    celery.py文件添加完成之后在同级目录__init__.py中添加,

    from __future__ import absolute_import, unicode_literals
    
    from .celery import app as celery_app
    
    __all__ = ['celery_app']

    在app应用下创建tasks.py文件。

    from __future__ import absolute_import, unicode_literals
    from celery import shared_task
    
    @shared_task
    def hello_world():
        with open("D:dc_testoutput.txt", "a") as f:
            f.write("hello world")
            f.write("
    ")

    文件都创建好之后,就开始运行项目吧, 等项目运行成功之后会自定生成以下文件。

    celerybeat-schedule.bak
    
    celerybeat-schedule.dat
    
    celerybeat-schedule.dir

    执行tasks:

    python manage.py celery worker -l info

    执行bate:

    python manage.py ceery beat

    到这里之后,就可以了。赶快试试吧。

    源码地址: https://github.com/Mrwyc/Django-Celery-Demo

  • 相关阅读:
    vuejs开发环境搭建
    贝塞尔曲线(cubic bezier)
    解决安装mysql的”A Windows service with the name MySQL already exists.“问题
    display:inline-block的间隙问题和解决办法
    限制两行显示,超出部分省略号
    border-radius四个值的问题
    PHP环境搭建
    CSS3属性box-sizing
    -webkit-tap-highlight-color
    gdb命令
  • 原文地址:https://www.cnblogs.com/wuyongcong/p/9553763.html
Copyright © 2020-2023  润新知