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 相关文章推荐
python3实现UDP协议的服务器和客户端
Jun 14 Python
python 数据的清理行为实例详解
Jul 12 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python如何发布程序的详细教程
Oct 09 Python
Python3爬虫之自动查询天气并实现语音播报
Feb 21 Python
浅谈Python批处理文件夹中的txt文件
Mar 11 Python
python实现控制COM口的示例
Jul 03 Python
django框架forms组件用法实例详解
Dec 10 Python
python如何保存文本文件
Jun 07 Python
Matplotlib自定义坐标轴刻度的实现示例
Jun 18 Python
python连接手机自动搜集蚂蚁森林能量的实现代码
Feb 24 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无限分类的深入理解
2013/06/02 PHP
destoon公司主页模板风格的添加方法
2014/06/20 PHP
PHP中的switch语句的用法实例详解
2015/10/21 PHP
Yii框架中jquery表单验证插件用法示例
2016/10/18 PHP
js 调整select 位置的函数
2008/02/21 Javascript
关于Aptana Studio生成自动备份文件的解决办法
2009/12/23 Javascript
JavaScript中变量提升 Hoisting
2012/07/03 Javascript
关于javascript模块加载技术的一些思考
2014/11/28 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
微信小程序使用车牌号输入法的示例代码
2019/08/20 Javascript
vue与django集成打包的实现方法
2019/11/11 Javascript
js实现炫酷光感效果
2020/09/05 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
Python内置函数之filter map reduce介绍
2014/11/30 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
python的数学算法函数及公式用法
2020/11/18 Python
英国领先的珍珠首饰品牌:Orchira
2016/09/11 全球购物
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
如何强制垃圾回收
2015/10/06 面试题
大学毕业感言
2014/01/10 职场文书
大学学习生活感言
2014/01/18 职场文书
巴西世界杯32强口号
2014/06/05 职场文书
社区平安建设汇报材料
2014/08/14 职场文书
影视后期实训报告
2014/11/05 职场文书
现实表现材料范文
2014/12/23 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
采购内勤岗位职责
2015/04/13 职场文书
简历自我评价:教师师德表现自我评价
2019/04/24 职场文书
小学记事作文之200字
2019/08/06 职场文书
Redis缓存-序列化对象存储乱码问题的解决
2021/06/21 Redis