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, 只需要在一台机器上运行,即可分布到其他机器运行。
这里仅记录我使用的过程,如需更多帮助请参考:
Celery分布式应用的更多相关文章
- ApacheCN Python 译文集 20211108 更新
Think Python 中文第二版 第一章 编程之路 第二章 变量,表达式,语句 第三章 函数 第四章 案例学习:交互设计 第五章 条件循环 第六章 有返回值的函数 第七章 迭代 第八章 字符串 第 ...
- Celery学习笔记
转载请注明出处:点我 我的第一篇博客!嘿嘿! 在公司实习,接触到的第一个项目就用到了Celery,之前是完全没有接触过Celery这玩意,然后花了点时间仔细的研究了下怎么用.在学习过程中也遇到了些问题 ...
- python celery 多work多队列
1.Celery模块调用 既然celery是一个分布式的任务调度模块,那么celery是如何和分布式挂钩呢,celery可以支持多台不通的计算机执行不同的任务或者相同的任务. 如果要说celery的分 ...
- Python之celery
一.celery简介 Celery是一个Python开发的异步分布式任务调度模块.celery本身不提供消息服务,使用第三方服务,也就是borker来传递任务,目前支持rebbing, redis, ...
- 解析分布式应用框架Ray架构源码
摘要:Ray的定位是分布式应用框架,主要目标是使能分布式应用的开发和运行. Ray是UC Berkeley大学 RISE lab(前AMP lab) 2017年12月 开源的新一代分布式应用框架(刚发 ...
- 异步任务队列Celery在Django中的使用
前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...
- celery使用的一些小坑和技巧(非从无到有的过程)
纯粹是记录一下自己在刚开始使用的时候遇到的一些坑,以及自己是怎样通过配合redis来解决问题的.文章分为三个部分,一是怎样跑起来,并且怎样监控相关的队列和任务:二是遇到的几个坑:三是给一些自己配合re ...
- 使用Masstransit开发基于消息传递的分布式应用
Masstransit作为.Net平台下的一款优秀的开源产品却没有得到应有的关注,这段时间有机会阅读了Masstransit的源码,我觉得我有必要普及一下这个框架的使用. 值得一提的是Masstran ...
- 解析大型.NET ERP系统 分布式应用模式设计与实现
C/S架构的应用程序,将一些复杂的计算逻辑由客户端转移到服务器端可以改善性能,同时也为了其它方面的控制..NET Remoting在局域网内调用的性能相当不错.ERP系统中基于.NET Remotin ...
随机推荐
- PHP引用符&的用法详细解析
本文转自:http://blog.csdn.net/vip_linux/article/details/10206091PHP中引用符&的用法.关于php的引用(就是在变量或者函数.对象等前面 ...
- Canvas:橡皮筋线条绘制
Canvas:橡皮筋线条绘制 效果演示 实现要点 事件监听 [说明]: 在Canvas中检测鼠标事件是非常简单的,可以在canvas中添加一个事件监听器,当事件发生时,浏览器就会调用这个监听器. 我们 ...
- sortable实现拖拽功能
使用sortable这个强力插件就很容易实现拖拽功能,它是目前比较牛逼的拖拽插件,无需jquery,就可以全面支持pc和移动,参考以下github文档就有很详细的说明,也给了很多 demo,插件就用我 ...
- PHP iconv函数
最近在做一个程序,需要用到iconv函数把抓取来过的utf-8编码的页面转成gb2312, 发现只有用iconv函数把抓取过来的数据一转码数据就会无缘无故的少一些. iconv函数库能够完成各种字符集 ...
- HYSBZ - 2243 染色 (树链剖分+线段树)
题意:树上每个结点有自己的颜色,支持两种操作:1.将u到v路径上的点颜色修改为c; 2.求u到v路径上有多少段不同的颜色. 分析:树剖之后用线段树维护区间颜色段数.区间查询区间修改.线段树结点中维护的 ...
- python进阶——进程/线程/协程
1 python线程 python中Threading模块用于提供线程相关的操作,线程是应用程序中执行的最小单元. #!/usr/bin/env python # -*- coding:utf-8 - ...
- 【leetcode刷题笔记】Rotate Image
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
- 用VS2013编译FFMPEG232
http://blog.csdn.net/finewind/article/details/38854517 如果只是拿来使用,网上有现成的SDK.但我是想深入研究FFMPEG代码,又不熟悉Linux ...
- Windows10安装mysql数据库
安装以及配置,参考下面链接 https://www.cnblogs.com/qjoanven/p/7898006.html 碰到的问题: 1. 安装的时候出现 mysql Install/Remove ...
- Go语言学习之常量(The way to go)
生命不止,继续go go go . 上一篇博客<Go语言学习之变量(The way to go)介绍了go中的变量,今天就介绍常量. const关键字 跟c++中一样,go中同样具有const关 ...