python模块介绍-gearman:程序排程
概述
Gearman是一套用来把程序需求委派给机器,提供通用的程序框架来将任务分发在机器运算。它同时具备并行工作的能力、负载均衡处理的能力,以及在不同程序语言之间沟通的能力。gear的英文意思是齿轮。特点如下:
Open Source且社区活跃。
Multi-language: 多国语言接口。
Flexible: 灵活,不拘泥于具体设计模式,可以快速将应用程序分布运作。比如使用Map/Reduce.
Fast: 协议简单快速,支持多线程,服务器端用C/C++书写,效率高。
Embeddable: 快速与轻量,适合嵌入式环境。
无单点失败: 不仅可以将系统模组化,也能容错方式进行。
稳定: Craig’s List, Tumblr, Yelp, Etsy等已经多年使用.
原理
Gearman最初在LiveJournal用于图片resize功能,由于图片resize需要消耗大量计算资源,因此需要调度到后端多台服务器执行, 完成任务之后返回前端再呈现到界面。Gearman分布式任务实现原理上只用到2个字段,function name和data。function name即任务名称,由client传给job server, job server根据function name选择合适的worker节点来执行。
组成
Client: 负责建立工作,发送需求 (application) 给 Job Server,Job Server 会找适合的Worker转发工作。
Job Server: 了解Client 端的需求,并查看哪个机器可以处理这项要求,在系统里它通常会是个Daemon。
Worker: Worker 通过 Job Server 的分派,开始执行 Client 端的工作。
消息队列
执行 Message Queue服务的 Job Server 可以是多台服务器组成,也就是分散式架构,在 Job Server 上执行 Worker 程式。
这些 Worker 程式会一直循环地等候,直到 Job Server 呼叫它执行工作。
Client 端发送出需求之后,会将需要的资料及动作记录在 Job Server 上,这时 Job Server 会查看是否有空闲并符合需求的 Worker。
在 Worker 结束工作后,会发送通知给 Job Server ,这时 Job Server 就会视状况把结果回传给 Client。
Client 端不需等候需求的执行结果,可以直接继续执行其他动作。
负载方式
Job Server 负载方式
Client 可能同时发出多个需求给 Job Server,由 Message Queue处理。
Job Server 开始处理多个需求,若其中一个发生问题,可以 Failover 到其他的机器。
Worker 会将多个需求一起进行运算,再看是同步或异步模式,回传结果给 Client。
同步 (Synchronous)
同步(Synchronous) 是指 Client 将需求 (Application) 丢给 Gearmand。
由 Gearmand 分派 Job 给各 Worker 去处理。
并同步 Response 回传给 Gearmand 告诉 Client 现在进度。
异步 (Asynchronous):
Client 将需求 (Application) 丢给 Gearmand。
由 Gearmand 分派 Job 给各 Worker 去处理。
Worker 处理完毕后,才会将结果回传给 Gearmand 告诉 Client 现在进度
快速入门
安装(centos为例):
yum -y install gearmand
安装python
pip install gearman
api
启动:
gearmand -L 192.168.0.232 -p 4730 -u root -d
查看状态:
# telnet 10.0.0.51 4730statustask01 0 0 1
自带实例:
# gearman -h localhost -p 4730 -w -f task01 -- wc -l # gearman -h localhost -p 4730 -f task01 < /etc/passwd
worker.py
import osimport gearmanimport mathclass CustomGearmanWorker(gearman.GearmanWorker): def on_job_execute(self, current_job): print "Job started" return super(CustomGearmanWorker, self).on_job_execute(current_job)def task_callback(gearman_worker, job): print job.data return job.datanew_worker = CustomGearmanWorker(['192.168.0.232:4730'])new_worker.register_task("echo", task_callback)new_worker.work()
client.py
from gearman import GearmanClientnew_client = GearmanClient(['192.168.0.232:4730'])current_request = new_client.submit_job('echo', 'foo')new_result = current_request.resultprint new_result
高级特性
在一个 Web 应用程序内可能有许多地方都会用到 Gearman。可以导入大量数据、发送许多电子邮件、编码视频文件、挖据数据并构建一个中央日志设施 — 所有这些均不会影响站点的体验和响应性。可以并行地处理数据。而且,由于 Gearman 协议是独立于语言和平台的,所以您可以在解决方案中混合编程语言。比如,可以用 PHP 编写一个 producer,用Python, C、Ruby 或其他任何支持 Gearman 库的语言编写 worker。
一个连接客户机和 worker 的 Gearman 网络实际上可以使用任何您能想象得到的结构。很多配置能够运行多个代理并将 worker 分配到许多机器上。负载均衡是隐式的:每个可操作的可用 worker(可能是每个 worker 主机具有多个 worker)从队列中拉出作业。一个作业能够同步或异步运行并具有优先级。
Gearman 的最新版本已经将系统特性扩展到了包含持久的作业队列和用一个新协议来通过 HTTP 提交工作请求。对于前者,Gearman 工作队列保存在内存并在一个关系型数据库内存有备份。这样一来,如果 Gearman 守护程序故障,它就可以在重启后重新创建这个工作队列。另一个最新的改良通过一个 memcached 集群增加队列持久性。memcached 存储也依赖于内存,但被分散于几个机器以避免单点故障。
Gearman 是一个刚刚起步却很有实力的工作分发系统。据 Gearman 的作者 Eric Day 介绍,Yahoo! 在 60 或更多的服务器上使用 Gearman 每天处理 600 万个作业。新闻聚合器 Digg 也已构建了一个相同规模的 Gearman 网络,每天可处理 400,000 个作业。Gearman 的一个出色例子可以在 Narada 这个开源搜索引擎(参见 参考资料)中找到。
本文地址
本站地址:python自动化测试 python开发自动化测试群113938272和开发测试群6089740 微博
参考资料
纯python的排程模块: