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

    # 一:编写函数,(函数执行的时间是随机的) import time import random # def foo(): # time.sleep(random.randrange(1,5)) # ...

  2. java基本类型和包装器类

    java是一种面向对象语言,java中的类把方法与数据连接在一起,并构成了自包含式的处理单元.但在java中不能定义基本类型(primitive type),为了能将基本类型视为对象来处理,并能连接相 ...

  3. 微信小程序之日期与时间插件

    页面 <picker mode="time" value="{{time}}" start="{{minTime}}" end=&qu ...

  4. NIO复习02

    Selector 1. Selector(选择器)是Java NIO中能够检测一到多个NIO通道,并能够知晓通道是否为诸如读写事件做好准备的组件.这样,一个单独的线程可以管理多个channel,从而管 ...

  5. pc端html页面到移动端等比缩放

    head标签里面加这个<meta name="viewport" content="user-scalable=yes">

  6. 【hihocoder】三十九周:二分.归并排序之逆序对

    就是用归并排序求数组中得逆序对.假设数组为a:[2 4 5],和b:[1 3],那么在这一次归并的时候逆序对这样求,belement表示当前result数组中b数组对应的元素个数,total表示逆序对 ...

  7. JavaWeb请求中文乱码

    解决中文乱麻问题,页面端发出的数据作两次encodeURI var name="张三"; encodeURI(encodeURI(name)); 后台解码: URLDecoder. ...

  8. Java 四大作用域总结

    一.ServletContext 1.生命周期:当Web应用被加载进容器时创建代表整个web应用的ServletContext对象,当服务器关闭或Web应用被移除时,ServletContext对象跟 ...

  9. android timed gpio (linux 3.0.0) 受时钟控制的gpio【转】

    本文转载自:https://blog.csdn.net/linxi_hnh/article/details/8043417 1 路径: drivers/staging/android/timed_gp ...

  10. MongoDB快速入门(十三)- 聚合count、distinct和group

    1. count:     --在空集合中,count返回的数量为0.     > db.test.count()    0    --测试插入一个文档后count的返回值.    > d ...