Celery分布式应用

最近有应用需要部署到不同的服务器上运行,但是有没有PBS这样的调度系统,就想起来Python的调度神器 Celery。现在针对我的实际应用做一些记录。

1. 安装

因为我并不注重结果而是把命令拿到不同的机器上运行,所以消息代理和结果保存我都选择了 Redis

# 只需要在一台服务器上安装 redis,其他服务器均使用该服务器redis即可
sudo apt-get install redis-server

# 所有服务器都要安装以下python package
sudo pip install Celery
sudo pip install redis

当然也可以选择虚拟环境安装python包。

2. 使用

目录下含有

tasks.py
test.py
test_dir

配置程序 celeryconfig.py(也可以把配置程序写到主程序内部)

# coding: utf-8
# celeryconfig.py
# 配置消息代理和结果保存数据库,均使用redis,当然也可以使用RabbitMQ
broker_url = 'redis://172.16.34.2:6379/0'
result_backend = 'redis://172.16.34.2:6379/0'

# 客户端与消费者(worker)直接传输数据的序列化方式
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
enable_utc = True

# 设置worker从消息代理处获取的任务数目,因为我运行的程序比较耗IO,而且不同的任务耗时不同,所以每次只分给一个机器一个任务
celery_acks_late = True
worker_prefetch_multiplier = 1 

主程序 tasks.py(worker设置)

import sys

from celery import Celery

app = Celery()
app.config_from_object('celeryconfig')

@app.task
def run(cmd):
    print('runing: %s' % cmd)
    print(os.uname()) # 打印机器名,可以判断在哪台机器上执行
    # 这个任务仅仅是运行shell命令
    os.system(cmd)

启动worker
这里需要在运行的机器上均运行一下命令,启动各自的worker

# 方法1
celery worker -A tasks -l info
# 这里的tasks 指的就是 tasks.py
# 这种方式启动worker,会一直占用窗口,不方便

# 方法2,采用multi方式启动
celery multi start  -A tasks worker --loglevel=info --autoscale=5,2 --pidfile=/your/path/celery_%n.pid --logfile=/your/path/celery_%n.log

# --pidfile 存储该celery的进程id
# --logfile 存储celery的日志信息
# 涉及的 %n 表示只包含主机名, 其他还有:
#       %h 包含域名的主机名
#       %d 只包含域名

# --autoscale 可以支持进程设置
# 5,2 表示 每个机器进程池平时保持2个进程,最大并发数为5个

测试test.py

from tasks import run

for ii in range(20):
    run.delay('touch test_dir/test_%s' % ii)
    # 这里的命令是在test_dir目录下建立20个文件
    # 这里使用 delay 属性,可以把需要运行的命令加入到消息队列,在各个机器上运行
    # 如果需要更高级的命令,我们可以使用run.apply_async(**), 可以设置更多功能,比如 优先级、延迟、重试等功能

运行test.py, 只需要在一台机器上运行,即可分布到其他机器运行。

这里仅记录我使用的过程,如需更多帮助请参考:

http://www.celeryproject.org/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

探索者v

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值