这里写自定义目录标题
celery分布式任务部署多台机器,形成一发布者,多消费者(每个消费者处理不同任务)
先上图
主要结构分为
任务发布者:发布任务到调度者中
调度者:一般为消息队列的存储,如redis
任务消费者:从调度者获取任务,消费任务,返回结果
结果存储:和调度者配对,消费者可以将结果反馈给结果存储队列
直接上代码
任务发布者:
main.py
# This is a sample Python script.
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
from celery import Celery
import celery_config
if __name__ == '__main__':
try:
app = Celery('tasks', broker=celery_config.broker_url)
# 此处的 celeryConfig 即 服务器A 上的配置,可以完全复制过来
app.config_from_object(celery_config)
print(app)
# 1. 此处 send_task(), 直接使用任务的名称,之前使用 tasks.say_hello 没有成功
# 2. 如果有 queue ,建议指定
# 3. 可以直接传参数的
for i in range(1, 10):
print(i)
app.send_task("tasks.add", queue=celery_config.task_queues[0], args=(i, i))
app.send_task("tasks.multiply", queue=celery_config.task_queues[1], args=(i, i))
except Exception as e:
print(e)
print("error")
任务发布者配置文件celery_config.py
from celery.schedules import crontab
from kombu import Queue
from kombu import Exchange
# celery的配置
from datetime import timedelta
broker_url = r"redis://IP:6379/5"
# broker_url = r"redis://127.0.0.1:6379/5"
# 结果存储地址
# CELERY_RESULT_BACKEND = r"redis://127.0.0.1:6379/3"
result_backend = r"redis://IP:6379/6"
# result_backend = r"redis://127.0.0.1:6379/6"
# 任务序列化方式, 4.0版本后默认为json
# CELERY_TASK_SERIALIZER ='json'
task_serializer = "json"
# 任务执行结果序列化方式
serializer = 'json'
# 任务结果保存时间,超过这个会删除结果
result_expires = 60 * 60 * 5
# 指定任务接受的内容类型(序列化),默认值:Default: {'json'} (set, list, or tuple). 按需要可以变成['application/json']
accept_content = {
'json'}
# 时区
timezone = "Asia/Shanghai"
enable_utc = True
worker_concurrency = 5 # celery worker并发数
worker_max_tasks_per_child = 5 # 每个worker最大执行任务数
"""
这里task_queues和task_routes需要成对出现
"""
task_queues = (
Queue('priority_low', exchange=Exchange('priority', type='direct'), routing_key='priority_low'),
Queue('priority_high'