前言
相信使用Python开发的小伙伴或多或少都接触过Celery,毕竟对于Python全局解释器锁(GIL)的原因,很多并行的需求会很难体现出Python的优势,再一个Python也是一门解释型语言,虽然从语法结构、第三方库等多方面来说,Python对开发者来说都是很友好的,但运行效率的确是最大的短板。鉴于此,分享下自己学习Celery的一些过程和使用方法,从安装Celery开始到调用,非常适合Celery初学者并很快上手
概念
Celery中文手册:www.celerycn.io/ru-men/cele…
实践操作
- 创建一个celery_study的项目
2. 安装Celery环境(v4.1.1)
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple celery==4.1.1
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple redis==3.2.1
- 项目目录结构如下(建议将各功能结构拆分写,便于后期的维护)
-celery_task Celery主目录
---__init__.py 实例化Celery对象
---celery_config.py Celery配置
---tasks.py 定时任务/执行任务
-cfg 项目配置目录
---config.yaml 配置文件
-common 项目通用工具类目录
-logs 日志目录
- 实例化Celery对象
__init__.py
# -*- coding: utf-8 -*-
from celery import Celery
# 启动celery
celery = Celery('elk_ip_detect')
# 加载celery配置
celery.config_from_object("celery_task.celery_config")
- 设置Celery配置内容
celery_config.py
# -*- coding: utf-8 -*-
from datetime import timedelta
from common.config_manager import ConfigManager
config = ConfigManager().get_key("redis")
# broker
BROKER_URL = "redis://:{}@{}:{}/{}".format(
config["REDIS_PASSWORD"],
config["REDIS_HOST"],
config["REDIS_PORT"],
config["REDIS_CELERY_BROKER_DB"]
)
# result_backend
CELERY_RESULT_BACKEND = "redis://:{}@{}:{}/{}".format(
config["REDIS_PASSWORD"],
config["REDIS_HOST"],
config["REDIS_PORT"],
config["REDIS_CELERY_BACKEND_DB"]
)
# imports
CELERY_IMPORTS = [
'celery_task.tasks',
]
# 任务结果超时时间
CELERY_TSKK_RESULT_EXPIRES = 60 * 60 * 24 * 3
# 时区
CELERY_TIMEZONE = "Asia/Shanghai"
# 定时任务调度器
CELERYBEAT_SCHEDULE = {
"my_task1": {
"task": "celery_task.tasks.my_task1",
"schedule": timedelta(seconds=10) # 每隔10秒执行一次my_task1函数
}
}
- 项目配置文件
config.yaml
#
# 项目配置文件
#
# redis配置
redis:
REDIS_HOST: "127.0.0.1"
REDIS_PORT: 6379
REDIS_CLIENTIP_DB: 2
REDIS_CELERY_BROKER_DB: 5
REDIS_CELERY_BACKEND_DB: 6
REDIS_PASSWORD: "redisadmin"
- 编写定时任务
tasks.py
from celery_task import celery
@celery.task
def my_task1():
print("执行my_task1任务")
# 通过delay异步调用my_task2
my_task2.delay()
@celery.task
def my_task2():
print("执行my_task2任务")
- 启动Celery
# 启动beat调度器
celery -A celery_task.manager.celery beat
# 启动worker,当前启动了4个worker
celery -A celery_task.manager.celery -c 4 worker -l info
如图可以看出,每隔10秒定时遍执行了my_task1函数,在my_task1执行后,异步调用了my_task2任务
9. 可以进入redis查看调度的任务和执行完后的记录,本次演示分别保存在了redis的5、6库中
到此celery的简单创建和调度就结束了
结尾
Celery是一个非常优秀的分布式框架,专注实时处理异步队列,和Django、Flask等框架也可以完美的结合,用来执行很多异步操作