Python如何快速实现分布式任务


Posted in Python onJuly 06, 2017

深入读了读python的官方文档,发觉Python自带的multiprocessing模块有很多预制的接口可以方便的实现多个主机之间的通讯,进而实现典型的生产者-消费者模式的分布式任务架构。

之前,为了在Python中实现生产者-消费者模式,往往就会选择一个额外的队列系统,比如rabbitMQ之类。此外,你有可能还要设计一套任务对象的序列化方式以便塞入队列。如果没有队列的支持,那不排除有些同学不得不从socket服务器做起,直接跟TCP/IP打起交道来。

其实multiprocessing.managers中有个BaseManager就为开发者提供了这样一个快速接口。

我们假定的场景是1个生产者(producer.py)+8个消费者(worker.py)的系统,还有一个中央节点负责协调(server.py)实现如下:

server.py

from multiprocessing.managers import BaseManager
import Queue

queue = Queue.Queue() #初始化一个Q,用于消息传递
class QueueManager(BaseManager):
  pass

QueueManager.register('get_queue', callable=lambda:queue) # 在系统中发布get_queue这个业务

if __name__ == '__main__':
  m = QueueManager(address=('10.239.85.193', 50000),authkey='abr' )
 # 监听所有10.239.85.193的50000口
  s = m.get_server()
  s.serve_forever()

worker.py

from multiprocessing.managers import BaseManager
from multiprocessing import Pool


class QueueManager(BaseManager):
 pass

QueueManager.register('get_queue') 

def feb(i): #经典的'山羊增殖'
  if i < 2: return 1
  if i < 5 : return feb(i-1) + feb(i-2)
  return feb(i-1) + feb(i-2) - feb(i-5)

def worker(i): 
  m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
#连接server
  m.connect()
  while True:
    queue = m.get_queue()
# 获取Q
   c = queue.get()
 print feb(c)

if __name__ == '__main__':

  p = Pool(8) # 分进程启动8个worker
  p.map(worker, range(8))
producer.py

from multiprocessing.managers import BaseManager


class QueueManager(BaseManager):
  pass
QueueManager.register('get_queue')


if __name__ == '__main__':
 m = QueueManager(address=('10.239.85.193', 50000), authkey='abr')
 m.connect()
 i = 0
 while True:
   queue = m.get_queue()
   queue.put(48)

   i+=1

系统会直接将Queue() 对象中的数据直接封装后通过TCP 50000端口在主机之间传递。不过需要注意的是,由于authkey的缘故,各个节点要求python的版本一致。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现方便使用的级联进度信息实例
May 05 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
linux下python抓屏实现方法
May 22 Python
Python 操作MySQL详解及实例
Apr 30 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
python实现简单登陆流程的方法
Apr 22 Python
Pycharm设置界面全黑的方法
May 23 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
详解Python正则表达式re模块
Mar 19 Python
Django缓存系统实现过程解析
Aug 02 Python
PIL包中Image模块的convert()函数的具体使用
Feb 26 Python
用python批量解压带密码的压缩包
May 31 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 #Python
Python标准库sched模块使用指南
Jul 06 #Python
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 #Python
基于Python的关键字监控及告警
Jul 06 #Python
Python中装饰器兼容加括号和不加括号的写法详解
Jul 05 #Python
利用python模拟sql语句对员工表格进行增删改查
Jul 05 #Python
利用python实现简单的循环购物车功能示例代码
Jul 05 #Python
You might like
php ctype函数中文翻译和示例
2014/03/21 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
二级域名或跨域共享Cookies的实现方法
2008/08/07 Javascript
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
js针对ip地址、子网掩码、网关的逻辑性判断
2016/01/06 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
vue2.0在table中实现全选和反选的示例代码
2017/11/04 Javascript
微信小程序去除左上角返回键的实现方法
2020/03/06 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
python实现sublime3的less编译插件示例
2014/04/27 Python
Python格式化css文件的方法
2015/03/10 Python
详解Python验证码识别
2016/01/25 Python
多版本Python共存的配置方法
2017/05/22 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
python字典一键多值实例代码分享
2019/06/14 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python中的 sort 和 sorted的用法与区别
2019/08/10 Python
Pycharm中安装Pygal并使用Pygal模拟掷骰子(推荐)
2020/04/08 Python
利用Python的folium包绘制城市道路图的实现示例
2020/08/24 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
python Tornado框架的使用示例
2020/10/19 Python
HTML5的结构和语义(4):语义性的内联元素
2008/10/17 HTML / CSS
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
无工作经验者个人求职信范文
2013/12/22 职场文书
面包店的创业计划书范文
2014/01/16 职场文书
大学生军训自我鉴定
2014/02/12 职场文书
人事部经理岗位职责
2014/03/07 职场文书
家长给学校的建议书
2014/05/15 职场文书
特种设备安全管理制度
2015/08/06 职场文书
教师岗位说明书
2015/09/30 职场文书
2016年党建工作简报
2015/11/26 职场文书
详解CSS3.0(Cascading Style Sheet) 层叠级联样式表
2021/07/16 HTML / CSS
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Redis keys命令的具体使用
2022/06/05 Redis