Celery(一):安装配置启动

1,706 阅读2分钟

安装

第三方库

celery==5.1.2
redis==3.5.3
eventlet==0.31.1

文件目录

|---celery_task
    |---tasks  # 任务文件夹
    |---celery.py  # 初始化文件
    |---celery_config.py  # 配置文件
    |---requirements.txt  # 依赖文件

celery.py

from __future__ import absolute_import  # 加入绝对引入特性
from celery import Celery

app = Celery("celery")
app.config_from_object("celery_task.celery_config") # 配置可导入文件名/类/函数

celery_config.py

from datetime import timedelta

from celery.schedules import crontab
from kombu import Queue

redis_pwd = ''  # redis密钥,没有填''
brokker_url = f"redis://:{redis_pwd}@127.0.0.1:6379/0"  # broker地址
result_backend= f"redis://:{redis_pwd}@127.0.0.1:6379/0"  # 结果储存地址

task_serializer = "json"  # 任务序列化方式
result_serializer = "json"  # 结果序列化方式
result_expires = 60 * 60 * 24  # 任务过期时间
accept_content= ["json"]  # 指定任务接受的内容类型(序列化)

timezone = "Asia/Shanghai"  # 设置时区
enable_utc = True  # 启动时区设置

worker_concurrency = 20  # worker的并发数,默认是服务器的内核项目,也是命令行-c的指定数目
worker_prefetch_multiplier = 4  # worker每次去broker钟预获取的任务数量
worker_max_tasks_per_child = 200  # 每个worker执行多少任务后自动杀死,防止没存溢出

# 导入任务文件, 每添加一个task文件都需要导入
imports = {
    celery_task.task.文件名
}

task_default_queue = "default_queue"  # 默认队列,未配置路由的任务会放入默认队列,需要启动默认队列work处理任务

# 配置队列
task_queues = {
    Queue(name="队列名", routing_key="路由key")
}
# 路由(哪些任务放入哪个队列)
task_routes = {
    "task函数路径":{"queue": 队列名,"routing_key": 路由key}
}

# 定时任务配置
beat_schedule = {
    # 60秒执行一次
    "tasks1": {
        "task": "任务导入路径",
        "schedule": timedelta(seconds=60),  # 任务模式
        # 以下是参数
        "args": (1, 2),
        "kwargs": {}
    }
    # 每天17:00执行一次
    "tasks2": {
        "task": "任务导入路径",
        "schedule": crontab(hour=17, minute=0)  # 任务模式
    }
}

启动

celery -A celery_task worker -P eventlet

  • -Q 队列名: 启动处理某个队列的worker
  • --loglevel: 配置日志等级,默认warn
  • --logfile: 指定日志写入文件路径
  • -P eventlet: 解决celery4.x版本之后对windwos不支持问题

问题

celery启动任务并发过多问题: ValueError: too many file descriptors in select()

解决: eventlet该用gevent: celery -A celery_task worker -P gevent