python分布式编程实现过程解析


Posted in Python onNovember 08, 2019

分布式编程的难点在于:

1.服务器之间的通信,主节点如何了解从节点的执行进度,并在从节点之间进行负载均衡和任务调度;

2.如何让多个服务器上的进程访问同一资源的不同部分进行执行

第一部分涉及到网络编程的底层细节

第二个问题让我联想到hdfs的一些功能。

首先分布式进程还是解决的是单机单进程无法处理的大数据量大计算量的问题,希望能加通过一份代码(最多主+从两份)来并行执行一个大任务。

这就面临两个问题,首先将程序分布到多台服务器,其次将输入数据分配给多台服务器。

第一个问题相对比较简单,毕竟程序一般不会太长,即便是超级jar包的spark程序,也不过百兆。

但数据里不同,如今企业级别的数据动辄GB、TB,如果在分布式程序执行之前首先要进行大容量数据的转移,显然是不可取的。

这时候我们就需要一个中央共享数据源,所有服务器都可以对这个数据源进行并行存取(块block),这就已经非常接近hdfs的功能。

因为在hdfs中,集群中的多台服务器共享同一个hdfs,每台机器访问hdfs就像访问本地数据一样(还是稍微慢一点);

计算任务执行完之后,每台服务器还可以将自己的计算结果写回hdfs,每台服务器的结果被存储成了结果目录中的小文件。

# task_master.py

import random, time, queue
from multiprocessing.managers import BaseManager

# 发送任务的队列:
task_queue = queue.Queue()
# 接收结果的队列:
result_queue = queue.Queue()

# 从BaseManager继承的QueueManager:
class QueueManager(BaseManager):
  pass

# 把两个Queue都注册到网络上, callable参数关联了Queue对象:
QueueManager.register('get_task_queue', callable=lambda: task_queue)
QueueManager.register('get_result_queue', callable=lambda: result_queue)
# 绑定端口5000, 设置验证码'abc':
manager = QueueManager(address=('', 5000), authkey=b'abc')
# 启动Queue:
manager.start()
# 获得通过网络访问的Queue对象:
task = manager.get_task_queue()
result = manager.get_result_queue()
# 放几个任务进去:
for i in range(10):
  n = random.randint(0, 10000)
  print('Put task %d...' % n)
  task.put(n)
# 从result队列读取结果:
print('Try get results...')
for i in range(10):
  r = result.get(timeout=10)
  print('Result: %s' % r)
# 关闭:
manager.shutdown()
print('master exit.')
# task_worker.py

import time, sys, queue
from multiprocessing.managers import BaseManager

# 创建类似的QueueManager:
class QueueManager(BaseManager):
  pass

# 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字:
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')

# 连接到服务器,也就是运行task_master.py的机器:
server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
# 端口和验证码注意保持与task_master.py设置的完全一致:
m = QueueManager(address=(server_addr, 5000), authkey=b'abc')
# 从网络连接:
m.connect()
# 获取Queue的对象:
task = m.get_task_queue()
result = m.get_result_queue()
# 从task队列取任务,并把结果写入result队列:
for i in range(10):
  try:
    n = task.get(timeout=1)
    print('run task %d * %d...' % (n, n))
    r = '%d * %d = %d' % (n, n, n*n)
    time.sleep(1)
    result.put(r)
  except Queue.Empty:
    print('task queue is empty.')
# 处理结束:
print('worker exit.')

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

Python 相关文章推荐
python函数返回多个值的示例方法
Dec 04 Python
利用Python实现图书超期提醒
Aug 02 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
python topN 取最大的N个数或最小的N个数方法
Jun 04 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
线程安全及Python中的GIL原理分析
Oct 29 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
用python中的matplotlib绘制方程图像代码
Nov 21 Python
python ubplot使用方法解析
Jan 10 Python
python实现IOU计算案例
Apr 12 Python
容易被忽略的Python内置类型
Sep 03 Python
python SOCKET编程基础入门
Feb 27 Python
详解mac python+selenium+Chrome 简单案例
Nov 08 #Python
python manage.py runserver流程解析
Nov 08 #Python
详解python中docx库的安装过程
Nov 08 #Python
numpy.array 操作使用简单总结
Nov 08 #Python
如何在python中写hive脚本
Nov 08 #Python
Python 依赖库太多了该如何管理
Nov 08 #Python
python+OpenCV实现车牌号码识别
Nov 08 #Python
You might like
Ext javascript建立超链接,进行事件处理的实现方法
2009/03/22 Javascript
jQuery 树形结构的选择器
2010/02/15 Javascript
我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环
2014/07/06 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
jQuery+css实现炫目的动态块漂移效果
2016/01/28 Javascript
jQuery实现iframe父窗体和子窗体的相互调用
2016/06/17 Javascript
JavaScript中数组的22种方法必学(推荐)
2016/07/20 Javascript
JavaScript文件的同步和异步加载的实现代码
2017/08/19 Javascript
10个最优秀的Node.js MVC框架
2017/08/24 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
[00:34]DOTA2上海特级锦标赛 Spirit战队宣传片
2016/03/04 DOTA
[01:10:03]OG vs EG 2018国际邀请赛淘汰赛BO3 第三场 8.23
2018/08/24 DOTA
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
浅谈Python中重载isinstance继承关系的问题
2018/05/04 Python
利用pandas进行大文件计数处理的方法
2018/07/25 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
python3格式化字符串 f-string的高级用法(推荐)
2020/03/04 Python
编写python代码实现简单抽奖器
2020/10/20 Python
pymysql模块使用简介与示例
2020/11/17 Python
使用Python爬虫爬取小红书完完整整的全过程
2021/01/19 Python
实例讲解CSS3中的border-radius属性
2015/08/18 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
世界上最大的铁人三项商店:Tri UK
2020/11/04 全球购物
高校毕业生自我鉴定
2013/10/27 职场文书
三好学生自我鉴定
2013/12/17 职场文书
师范学院毕业生求职信
2014/06/24 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
单位实习鉴定评语
2015/01/04 职场文书
学生评语集锦
2015/01/04 职场文书
CSS3 实现NES游戏机的示例代码
2021/04/21 HTML / CSS
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
Opencv实现二维直方图的计算及绘制
2021/07/21 Python