安装
第三方库
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