gearman 分布式系统学习 python

前段时间遇到了这样一个需求

某一客户端向一个服务器提交任务

服务器再将分发下去由对于的工作人员来完成

前辈告诉我用gearman搭建一个分布式系统。gearman有三个部分,client、service和worker

client:提交任务

service:分配任务

worker:执行任务

它可以实现的效果就是一台机器上搭建好了服务器

另外可以多台机器作为客户端,可以一起提交任务,然后服务器会用个队列来存起来

然后就是起多台机器作为worker去服务器要任务

把每个步骤都分布到了不同的主机上,这就是典型的分布式系统。

(感觉这个这就是一个加强版的多线程机制,一个线程提交任务到队列,起多个线程去队列中去。就是一个网游一个是单机)

详细介绍可以看官网Gearman,官网上还有各种语言的例子

配置过程的话跟着网上来就可以,前辈说linux就是配置特别麻烦,等配置好了之后,用起来就方便了

gearman client

提交任务用法很简单,以下是用例

gm_client = gearman.GearmanClient([‘localhost:4730‘])

gm_client.submit_job(GRARMAN_TASK_NAME, data, priority=gearman.PRIORITY_HIGH, background=True)
  

记得先引包 import gearman

[‘localhost:4730‘] 就是gearman服务器的位置,端口默认是4730

然后client有一个submit_job的方法,下面有该函数的源码,有一堆参数意思就和名字一样。如background 参数就是提交后台任务False就是等待返回结果,适用于大量提交任务。

其中最重要的参数 就是 task  在测试代码中我填写是 GRARMAN_TASK_NAME 。这个是任务的唯一标识,就是可以有多个client提交任务,但服务器怎么识别任务呢,就是靠这参数,当然worker也是靠这个参数识别。(我第一次写的时候把这个参数写成了“echo”结果提交了一坨任务,但我自己的worker只收到几个,我调试了好久才发现。。。)

gearman.client.submit_job 源码

1     def submit_job(self, task, data, unique=None, priority=PRIORITY_NONE, background=False, wait_until_complete=True, max_retries=0, poll_timeout=None):
2         """Submit a single job to any gearman server"""
3         job_info = dict(task=task, data=data, unique=unique, priority=priority)
4         completed_job_list = self.submit_multiple_jobs([job_info], background=background, wait_until_complete=wait_until_complete, max_retries=max_retries, poll_timeout=poll_timeout)
5         return gearman.util.unlist(completed_job_list)

gearman worker

worker里面的话,除了GRARMAN_TASK_NAME  和 [‘localhost:4730‘]值得注意意外,还有一个地方就是每个worker都需要注册一下自己要做的任务,就是下面代码中的

gm_worker.register_task(GRARMAN_TASK_NAME, task_listener_reverse)

注册的名字需要和对应client中的一致,后面一个参数是一个方法,写的格式也是代码中的那样,相当于就是拿到了任务怎么干,这个怎么干的过程就写到方法里面

gm_worker = gearman.GearmanWorker([‘localhost:4730‘])

def task_listener_reverse(gearman_worker, gearman_job):

     #gearman_job 就是client端传过来的数据

     print "这里是想要干的事"

     return gearman_job.data[::-1]#返回数据的逆序

#GRARMAN_TASK_NAME  这个名字需要是任务的唯一标识
gm_worker.register_task(GRARMAN_TASK_NAME, task_listener_reverse)


GearmanAdminClient

今天有一个需求

得到gearman服务上有多少个job,又有多少worker正在工作

然后根据job和worker的数量进行一些相应的调整工作

突然发现gearman中GearmanAdminClient有以下两个方法,瞬间完成任务

def get_workers(self):
    """Retrieves a list of workers and reports what tasks they‘re operating on"""
    self.establish_admin_connection()
    self.current_handler.send_text_command

(GEARMAN_SERVER_COMMAND_WORKERS)
    return self.wait_until_server_responds(GEARMAN_SERVER_COMMAND_WORKERS)

def get_status(self):
    """Retrieves a list of all registered tasks and reports how many items/workers are in 

the queue"""
    self.establish_admin_connection()
    self.current_handler.send_text_command(GEARMAN_SERVER_COMMAND_STATUS)
    return self.wait_until_server_responds(GEARMAN_SERVER_COMMAND_STATUS)

测试代码

    ad_client=gearman.GearmanAdminClient([‘localhost:4730‘])

    list=ad_client.get_workers()
    for row in list:
        print row

    print "\n"

    list=ad_client.get_status()
    for row in list:
        print row

部分结果展示

{‘file_descriptor‘: ‘34‘, ‘tasks‘: (), ‘client_id‘: ‘-‘, ‘ip‘: ‘127.0.0.1‘}
{‘file_descriptor‘: ‘50‘, ‘tasks‘: (‘resize‘, ‘like‘, ‘dislike‘), ‘client_id‘: ‘-‘, ‘ip‘: ‘127.0.0.1‘}
{‘file_descriptor‘: ‘46‘, ‘tasks‘: (‘resize‘, ‘like‘, ‘dislike‘), ‘client_id‘: ‘-‘, ‘ip‘: ‘127.0.0.1‘}
{‘file_descriptor‘: ‘59‘, ‘tasks‘: (‘add_phone_info‘,), ‘client_id‘: ‘-‘, ‘ip‘: ‘127.0.0.1‘}
{‘file_descriptor‘: ‘55‘, ‘tasks‘: (‘add_phone_info‘,), ‘client_id‘: ‘-‘, ‘ip‘: ‘127.0.0.1‘}

{‘workers‘: 0, ‘running‘: 0, ‘task‘: ‘apkcrawler‘, ‘queued‘: 22028}
{‘workers‘: 0, ‘running‘: 0, ‘task‘: ‘reverse‘, ‘queued‘: 0}
{‘workers‘: 1, ‘running‘: 0, ‘task‘: ‘echo‘, ‘queued‘: 0}
{‘workers‘: 10, ‘running‘: 0, ‘task‘: ‘add_phone_info‘, ‘queued‘: 0}
{‘workers‘: 0, ‘running‘: 0, ‘task‘: ‘write_hbase‘, ‘queued‘: 0}
{‘workers‘: 0, ‘running‘: 0, ‘task‘: ‘write_amazon‘, ‘queued‘: 0}
{‘workers‘: 10, ‘running‘: 0, ‘task‘: ‘dislike‘, ‘queued‘: 0}

  

时间: 2024-12-07 00:45:20

gearman 分布式系统学习 python的相关文章

学习Python随想

进入大三之后进入了一周基本都是专业课的状态,虽然相比之前几个学期课时量减少了,但实际上学要学习的任务却大大增加了,而类似于Python,spss这一类的课程是之前之前并没有听说过的,但在上过两周之后发现,Python是类似于c语言一类的课程,而之前的c语言和数据结构学得并不好,所以其实在内心深处是有一丝丝的惧怕的,希望在实践课上能多做一些类似于第一次的学打代码的联系,多找找感觉. 课堂进度十分之快,时而跟得上时而跟不上,而一旦跟不上就会跟多米诺骨牌似的,影响接下来的课堂学习.在智慧云教室最大的感

【个人计划】告别英雄联盟,开始学习Python

不知不觉中接触英雄联盟已经快两年了,记得是大四那年找完工作,一下比较清闲,宿舍刚好有lol的氛围,于是乎,四个新手在何大神的带领下,走上了lol的道路.不得不说,从那以后,花费在lol上的时间太多啦,据我估计,个人玩了将近2000了吧,别看局数这么多,其实就是个渣渣,技术太菜了,这也就是我告别英雄联盟的原因啦,根本没有玩这个游戏的天赋,技术上没有一点点提高,一直就是在浪费时间罢了. 就我个人而言,1.在补兵方面,时好时坏,而且有时候性子急,不太注重前期的补兵发育,往往导致输的结局:2.游戏中大部

学习python第一天

学习Python第一天 Python小白,做Linux运维5年,纯系统运维已经不能满足日常工作需要,所以学习Linux运维开发入门级语言python 前言: Python, 是一种面向对象.解释型计算机程序设计语言,由Guido van Rossum于1989年发明,第一个公开发行版发行于1991年. Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议. Python语法简洁清晰,特色之一是强制用空白符(white

重新学习python系列(一)? WTF?

重新学习python:两年前学了点python之后就一直没做做过啥项目, 基本上全忘光了,复习一下搞点事情 or |and & ord() ascii转16进制 chr()  16进制转ascii >>> u'ABC'.encode('utf-8') 'ABC' >>> u'中文'.encode('utf-8') '\xe4\xb8\xad\xe6\x96\x87' >>> 'abc'.decode('utf-8') u'abc' >&g

Python学习--Python基础语法

第一个Python程序 交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,提示窗口如下: Window上在安装Python时已经已经安装了默认的交互式编程客户端,提示窗口如下: 在Python提示符中输入一下文本,然后按回车查看运行结果: print 'hello world'; 输出: hello world 脚本式编程 让我们来写一个简单的Python脚本,所有的Pytho

几条学习python的建议

熟悉python语言, 以及学会python的编码方式. 熟悉python库, 遇到开发任务的时候知道如何去找对应的模块. 知道如何查找和获取第三方的python库, 以应付开发任务. 学习步骤 安装开发环境 如果你在window下, 去下载pythonxy安装起来, 然后运行python, 进入python解释环境. 如果你在ubuntu下, 执行: sudo apt-get install python, 然后在命令行下运行python, 进入python解释环境. 学习方法 作为一名成熟的

鱼C《零基础入门学习Python》10-17节课时知识点总结

第10讲:列表:一个打了激素的数组 1. 列表都可以存放一些什么东西?  我们说 Python 的列表是一个打了激素的数组,如果把数组比喻成集装箱,那么 Python 的列表就是一个大仓库,Ta 可以存放我们已经学习过的任何数据类型. 2. 向列表增加元素有哪些方法?  三种方法想列表增加元素,分别是:append().extend() 和 insert().    3. append() 方法和 extend() 方法都是向列表的末尾增加元素,请问他们有什么区别?  append() 方法是将

学习python的小随笔

Python在课表中的名字是高级语言程序设计.上了两周的专业课,我想说我真的是想来学教育的,现在成了计算机了.我还想说,有没有一种可以用中文写程序的软件,有志向的大佬们赶紧弄个吧!       其实关于学习Python倒是不反感,无论是当初学习c++,还是现在学Python,都感觉这个东西挺有意思的.当你能把一个程序写出来并且运转成功之后,那种成就感是难以形容的.(哪怕是对着书敲上的)       希望老师教学中.把我们当做一个程序小白,很多老师以为学过了就精通了,可是事实不是那样.个人感觉Py

学习Python的第一课(简单的单元测试)

由于有C#开发基础,感觉学习Python应该不难,主要是一些语法了,再加上现在互联网这么发达. 感觉还是要有思路,否则学什么也只能是什么. 话不多说,简单发下这几天的学习成果吧: 第一次写博客,大家不要见笑啊 简单的语法就不多说了,随便搜搜就可以得到.() 单元测试来了: 要做两个测试: # 用于判断质数 import math def isPrime(n): print ("验证数字"+str(n)+"是否质数开始") print ("开平方:"