最近有应用需要部署到不同的服务器上运行,但是有没有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/

Celery分布式应用的更多相关文章

  1. ApacheCN Python 译文集 20211108 更新

    Think Python 中文第二版 第一章 编程之路 第二章 变量,表达式,语句 第三章 函数 第四章 案例学习:交互设计 第五章 条件循环 第六章 有返回值的函数 第七章 迭代 第八章 字符串 第 ...

  2. Celery学习笔记

    转载请注明出处:点我 我的第一篇博客!嘿嘿! 在公司实习,接触到的第一个项目就用到了Celery,之前是完全没有接触过Celery这玩意,然后花了点时间仔细的研究了下怎么用.在学习过程中也遇到了些问题 ...

  3. python celery 多work多队列

    1.Celery模块调用 既然celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢,celery可以支持多台不通的计算机执行不同的任务或者相同的任务. 如果要说celery的分 ...

  4. Python之celery

    一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...

  5. 解析分布式应用框架Ray架构源码

    摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...

  6. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  7. celery使用的一些小坑和技巧(非从无到有的过程)

    纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...

  8. 使用Masstransit开发基于消息传递的分布式应用

    Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用. 值得一提的是Masstran ...

  9. 解析大型.NET ERP系统 分布式应用模式设计与实现

    C/S架构的应用程序,将一些复杂的计算逻辑由客户端转移到服务器端可以改善性能,同时也为了其它方面的控制..NET Remoting在局域网内调用的性能相当不错.ERP系统中基于.NET Remotin ...

随机推荐

  1. MySQL 多表查询(Day43)

    阅读目录 一,介绍 二,多表连接查询 三,符合条件链接查询 四,子查询 五,综合练习 ========================================================= ...

  2. BCB直接访问硬件端口和物理内存 - WinIO的应用

    BCB直接访问硬件端口和物理内存 - WinIO的应用 (读硬盘参数和主板BIOS信息, 支持 Win9x/NT/2k/XP/2003) 关于直接访问端口, 有很多网站很多文章都讨论过, 但总找不到非 ...

  3. 微信小程序学习笔记(2)--------框架之目录结构

    框架提供了自己的视图层描述语言 wxml 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统. 一.响应的数据绑定 框架的核心是一个响应的数据绑定 ...

  4. POJ - 3662 Telephone Lines (Dijkstra+二分)

    题意:一张带权无向图中,有K条边可以免费修建.现在要修建一条从点1到点N的路,费用是除掉免费的K条边外,权值最大的那条边的值,求最小花费. 分析:假设存在一个临界值X,小于X的边全部免费,那么此时由大 ...

  5. RAID详解[RAID0/RAID1/RAID5]

    RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失 ...

  6. Python面试题之Python正则表达式指南

    1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十 ...

  7. java中string与byte[]之间的转化分析

    背景:最近接触zookeeper的java开发,由于zookeeper中传的好像都是byte[]的数据(需要进一步确认),好多情况下都需要进行转换. 1)和zookeeper原生API不同,通过zkc ...

  8. fabric安装使用

    可以使用pip安装fabric,注意使用pip 安装fabric时,一定要指定版本,不要安装2.0版本的,无论怎样都会提示没有api这样模块,所以指定安装 pip install fabric==1. ...

  9. Difference between RouteTable.Routes and HttpConfiguration.Routes?

    https://stackoverflow.com/questions/12533782/difference-between-routetable-routes-and-httpconfigurat ...

  10. VLAN虚拟局域网技术(一)-计算机网络

    本文主要知识来源于学校课程,部分知识来自于H3C公司教材,未经许可,禁止转载.如需转载,请联系作者并注明出处. 1.  VLAN(Virtual LAN):我们称之为虚拟局域网,它的作用就是将物理上互 ...