Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统
Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成。
djcelery是Python的第三方库,它可以用于是任何的Python的项目中,因为我们始终可以把Celery看成一个独立的模块去操纵其它的模块。因此,我们也可以在Django项目中使用的Celery,但值得注意的是,在Django中使用Celery的方式有两种:
消息中间件Celery本身不提供消息服务,依赖于中间件RabbitMQ, Redis等等
使用场景异步任务:将耗时操作任务提交给Celery去异步执行,比如发送短信/邮件、消息推送、音视频处理等等
定时任务:定时执行某件事情,比如每天数据统计
pip install django-celery
配置目录结构
app - urls.py - models.py - tasks.pyproject - __init__.py - settings.py - celery.py - urls.pymanage.py
settings.py INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'djcelery',)# celery相关配置BROKER_BACKEND = 'redis'BROKER_URL = 'redis://:{password}@{host}:{port}/{db}'.format(password=REDIS_PWD, host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB, )CELERY_TIMEZONE = TIME_ZONECELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend'CELERY_ENABLE_UTC = FalseCELERYD_LOG_FILE = BASE_DIR + "/logs/celery/celery.log" # log路径CELERYBEAT_LOG_FILE = B��ʽ����,��������ASE_DIR + "/logs/celery/beat.log" # beat log路径CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml'] # 允许的格式CELERY_TASK_SERIALIZER = 'json'CELERYD_MAX_TASKS_PER_CHILD = 3
配置消息中间件
Redis
BROKER_BACKEND = 'redis'BROKER_URL = 'redis://:{password}@{host}:{port}/{db}'
RabbitMQ
BROKER_BACKEND = 'amqp'broker_url = 'amqp://guest:guest@localhost:5672//'
celery.py #!/usr/bin/env python2# -*- coding:utf-8 -*-# Author:jjfrom __future__ import absolute_import, unicode_literalsimport osfrom celery import Celeryfrom django.conf import settingsos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lot_canal_info.settings') # 设置django环境app = Celery('lot_canal_info')app.config_from_object('django.conf:settings') # 使用CELERY_ 作为前缀,在settings中写配置app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) # 发现任务文件每个app下的task.py
__init__.py
from __future__ import absolute_import, unicode_literalsfrom .celery import app as celery_app__all__ = ['celery_app']
tasks.py
# -*- coding: utf-8 -*-"""Created on 2019-11-06@author: jj"""import djangodjango.setup()from celery import taskfrom celery import shared_taskfrom django.conf import settingsimport datetime@shared_taskdef TASK():print datetime.datetime.now()
启动定时任务 然后启动终端,切换到Django项目的根目录下,运行:
celery worker -A 项目名 -l info
这条命令用于启动worker, worker本质上执行任务的线程,就是一个干苦力的工人。
celery beat -A 项目名 -l info
上面这条任务用于启动beater,它就像一个领导,负责把任务分发给工人。
django-celery beat报错 error pid
djcelery 异常报错解决方案
celery后台服务配置Windows、Linux 待完成