Celery入门及使用

293 阅读2分钟

前言

相信使用Python开发的小伙伴或多或少都接触过Celery,毕竟对于Python全局解释器锁(GIL)的原因,很多并行的需求会很难体现出Python的优势,再一个Python也是一门解释型语言,虽然从语法结构、第三方库等多方面来说,Python对开发者来说都是很友好的,但运行效率的确是最大的短板。鉴于此,分享下自己学习Celery的一些过程和使用方法,从安装Celery开始到调用,非常适合Celery初学者并很快上手

概念

Celery中文手册:www.celerycn.io/ru-men/cele…

实践操作

  1. 创建一个celery_study的项目

image.png 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
  1. 项目目录结构如下(建议将各功能结构拆分写,便于后期的维护)

image.png

-celery_task                 Celery主目录
    ---__init__.py             实例化Celery对象
    ---celery_config.py        Celery配置
    ---tasks.py                定时任务/执行任务
-cfg                         项目配置目录
    ---config.yaml             配置文件
-common                      项目通用工具类目录
-logs                        日志目录
  1. 实例化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")
  1. 设置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函数
    }
}
  1. 项目配置文件
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"
  1. 编写定时任务
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任务")
  1. 启动Celery
# 启动beat调度器
celery -A celery_task.manager.celery beat
# 启动worker,当前启动了4个worker
celery -A celery_task.manager.celery -c 4 worker -l info

image.png 如图可以看出,每隔10秒定时遍执行了my_task1函数,在my_task1执行后,异步调用了my_task2任务 image.png 9. 可以进入redis查看调度的任务和执行完后的记录,本次演示分别保存在了redis的5、6库中 image.png 到此celery的简单创建和调度就结束了

结尾

Celery是一个非常优秀的分布式框架,专注实时处理异步队列,和Django、Flask等框架也可以完美的结合,用来执行很多异步操作