Celery 配置MQ 安排不同的worker 去完成不同的任务

在使用celery的时候,想让不同的worker去做不同的任务,因为每个任务对机器的性能要求不同。

如要是需要运行较为复杂的算法的话,可能需要CPU 比较强劲的机器,反之如果只是简单计算,或者程序对CPU要求不高,对其他硬件有要求,那就可能需要按需分配worker, 从而减少成本。

具体步骤如下,在同一个task.py 文件下写入相应的 任务

from celery import Celery
import time
from celery.exceptions import SoftTimeLimitExceeded


import os
from celery import Celery

#: Set default configuration module name
os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')
str1 =os.environ.setdefault('CELERY_CONFIG_MODULE', 'celeryconfig')

app = Celery()
app.config_from_envvar('CELERY_CONFIG_MODULE')


# 视频压缩
@app.task(time_limit=20)
def video_compress(video_name):
    time.sleep(10)
    print ('Compressing the:'+ video_name)
    return 'success'


@app.task(bind=True)
def hello(self, a, b):
    time.sleep(1)
    self.update_state(state="PROGRESS", meta={'progress': 50})
    time.sleep(1)
    self.update_state(state="PROGRESS", meta={'progress': 90})
    time.sleep(1)
    return 'hello world: %i' % (a+b)
#如果是一个大型项目中的一个文件的话需要写明这个task的名字,否则route不会识别 如“app.celerytask.tasks.video_upload”
@app.task(name='文件目录结构') 
def video_upload(video_name):
    time.sleep(5)
    print ('正在上传视频')
    return 'success'

# 压缩照片
@app.task
def image_compress(image_name):
    time.sleep(10)
    print ('Compressing the:', image_name)
    return 'success'

# 其他任务
@app.task
def other(str):
    time.sleep(10)
    print ('Do other things')
    return 'success'

配置文件 celeryconfig.py

from kombu import Exchange, Queue
# 配置时区
CELERY_TIMEZONE = 'Asia/Shanghai'

BROKER_URL = '(你的RabbitMQ)'
RESULT_BACKEND = 'redis://(你的redis):6379'
# 定义一个默认交换机
default_exchange = Exchange('dedfault', type='direct')

# 定义一个媒体交换机
media_exchange = Exchange('media', type='direct')
timeout_exchange = Exchange('timeoutExchange', type='direct')

# 创建三个队列,一个是默认队列,一个是video、一个image
CELERY_QUEUES = (
    Queue('default', default_exchange, routing_key='default'),
    Queue('videos', media_exchange, routing_key='media.video'),
    Queue('images', media_exchange, routing_key='media.image'),
    Queue('timeoutQueue', timeout_exchange, routing_key='timeout')

)

CELERY_DEFAULT_QUEUE = 'default'
CELERY_DEFAULT_EXCHANGE = 'default'
CELERY_DEFAULT_ROUTING_KEY = 'default'
#
CELERY_ROUTES = (
    {'tasks.image_compress': {
        'queue': 'images',
        'routing_key': 'media.image'
    }
    },
    {'app.celerytask.tasks.video_upload': {#相应的 在 route 配置中写明这个 task 的名字 以便 route 成功识别
        'queue': 'videos',
        'routing_key': 'media.video'
    }
    },
    {'tasks.video_compress': {
        'queue': 'videos',
        'routing_key': 'media.video'
    }
    },
    {'tasks.timeout_test': {
        'queue': 'timeoutQueue',
        'routing_key': 'timeout'
    }
    },
)

# 在出现worker接受到的message出现没有注册的错误时,使用下面一句能解决
CELERY_IMPORTS = ("tasks",)

启动worker时使用 -Q 来限定Worker 的subscribe 的MQ


# 启动默认的worker
celery worker1 -Q default --loglevel=info
# 启动处理视频的worker
celery worker2 -Q videos --loglevel=info
# 启动处理图片的worker
celery worker3 -Q images --loglevel=info


这样 worker1 监听的就是默认的queue

worker2 监听的就是 video queue, 负责处理 video_upload  以及 video_compress  任务,相应的worker3 就负责image_compress

这样我们就可以在不同的节点上分别部署不同的worker 让他们分别处理不同的任务。

代码来自网上,我以前看到的博文

具体出处忘了 可能是这里https://www.jianshu.com/p/11b420aea529

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值