五分钟看懂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_test\output.txt", "a") as f:
        f.write("hello world")
        f.write("\n")

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

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

 

posted @ 2018-08-29 13:37  WrYcF  阅读(2402)  评论(0编辑  收藏  举报
Live2D