Celery 是一款非常简单、灵活、可靠的分布式系统,可用于处理大量消息,并且提供了一整套操作此系统的一系列工具。

Celery 是一款消息队列工具,可用于处理实时数据以及任务调度。

首先,Celery可以任意部署。而非必要继承框架使用。单独使用时,如何搭建?主要从:项目架构配置使用

项目架构

async_tasks		celery 目录
	__init_.py  celery 对象
	config.py		celery 配置
	tasks.py		celery 任务 也可以是一个目录。根据模块拆分
	schedules_config.py  定时任务配置

配置

celery 对象

import os
from celery import Celery, platforms
from async_tasks import config

platforms.C_FORCE_ROOT = True
os.environ['C_FORCE_ROOT'] = 'true'

app = Celery('app')  # 创建 celery 实例
app.config_from_object(config)  # 加载配置
# 加载 tasks

app.autodiscover_tasks([
    'async_tasks.schedules'
])

celery 配置

from async_tasks.schedules_config import beat_schedules
import os

redis_host = os.environ.get('REDIS_HOST', '127.0.0.1')
redis_port = os.environ.get('REDIS_PORT', 6379)
# redis_password = os.environ.get("REDIS_PASSWORD", "equotaadmin")

# redis_url = f'redis://default:{redis_password}@{redis_host}:{redis_port}'
redis_url = f'redis://{redis_host}:{redis_port}'
broker_url = f'{redis_url}/15'

# 配置celery时区,默认时UTC。
timezone = 'Asia/Shanghai'
# 可接受的内容格式
accept_content = ['pickle', 'json']
# 任务序列化数据格式
task_serializer = "json"
# 结果序列化数据格式
result_serializer = "json"

result_backend = f'{redis_url}/14'
result_cache_max = 100  # 任务结果最大缓存数量
result_expires = 3600  # 任务过期时间

worker_redirect_stdouts_level = 'INFO'

beat_schedule_filename = 'celery-beat'

# 加载 定时任务
imports = [
    'async_tasks.tasks',
]

beat_schedule = beat_schedules

celery 任务

from async_tasks import app


@app.task
def test():
    print('hello')

定时任务配置

from celery.schedules import crontab

beat_schedules = {
    'test': {
        'task': 'async_tasks.tasks.test',
        'schedule': crontab('*'),
    },
}

使用

启动命名

celery -A async_tasks worker -l info # celery worker
celery -A async_tasks beat -l info # celery beat

python 定时任务可以加到 celery beat中。如果使用那么你要起来两个服务一个是 celery worker另一个是定时服务。

项目中使用有两种方式调用

test.delay() 简单使用
test.apply_async() 高阶使用