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 27 Python
Python创建模块及模块导入的方法
May 27 Python
日常整理python执行系统命令的常见方法(全)
Oct 22 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
Python功能点实现:函数级/代码块级计时器
Jan 02 Python
python实现石头剪刀布程序
Jan 20 Python
python根据txt文本批量创建文件夹
Dec 08 Python
Python使用docx模块实现刷题功能代码
Feb 13 Python
推荐技术人员一款Python开源库(造数据神器)
Jul 08 Python
vue.js刷新当前页面的实例讲解
Dec 29 Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 Python
python的netCDF4批量处理NC格式文件的操作方法
Mar 21 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
让你同时上传 1000 个文件 (二)
2006/10/09 PHP
PHP基础陷阱题(变量赋值)
2012/09/12 PHP
php生成静态页面的简单示例
2014/04/17 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
Thinkphp 中 distinct 的用法解析
2016/12/14 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
ajax的hide隐藏问题解决方法
2012/12/11 Javascript
jQuery中setTimeout的几种使用方法小结
2013/04/07 Javascript
将json当数据库一样操作的javascript lib
2013/10/28 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
JS基于HTML5的canvas标签实现炫目的色相球动画效果实例
2016/08/24 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
详解js静态资源文件请求的处理
2017/08/01 Javascript
Node.js使用Express.Router的方法
2017/11/14 Javascript
判断滚动条滑到底部触发事件(实例讲解)
2017/11/15 Javascript
如何制作一个Node命令行图像识别工具
2018/12/12 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
Python实现打砖块小游戏代码实例
2019/05/18 Python
Django外键(ForeignKey)操作以及related_name的作用详解
2019/07/29 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
PyCharm第一次安装及使用教程
2020/01/08 Python
使用IPython或Spyder将省略号表示的内容完整输出
2020/04/20 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
Python子进程subpocess原理及用法解析
2020/07/16 Python
预订从美国飞往印度的机票:MyTicketsToIndia
2017/05/19 全球购物
friso美素佳儿官方海外旗舰店:荷兰原产原罐
2017/07/03 全球购物
请说出以下代码输出什么
2013/08/30 面试题
策划助理岗位职责
2013/11/18 职场文书
车工岗位职责
2013/11/26 职场文书
关于抽烟的检讨书
2014/02/25 职场文书
勤俭节约演讲稿
2014/05/08 职场文书
建筑工地标语
2014/06/18 职场文书
金融管理专业求职信
2014/07/10 职场文书
优秀乡村医生先进事迹材料
2014/08/23 职场文书
电子商务实训报告总结
2014/11/05 职场文书