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对json的操作总结
Jan 05 Python
numpy中索引和切片详解
Dec 15 Python
TensorFlow实现RNN循环神经网络
Feb 28 Python
python数字图像处理实现直方图与均衡化
May 04 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
Python定时任务随机时间执行的实现方法
Aug 14 Python
Python3 合并二叉树的实现
Sep 30 Python
Python 3.8正式发布重要新功能一览
Oct 17 Python
python zip()函数使用方法解析
Oct 31 Python
TensorFlow的reshape操作 tf.reshape的实现
Apr 19 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
jQuery事件绑定.on()简要概述及应用
2013/02/07 Javascript
IE下JS读取xml文件示例代码
2013/08/05 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
JS实用技巧小结(屏蔽错误、div滚动条设置、背景图片位置等)
2016/06/16 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
javascript基本数据类型和转换
2017/03/17 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
vue2.0 better-scroll 实现移动端滑动的示例代码
2018/01/25 Javascript
ES6学习笔记之map、set与数组、对象的对比
2018/03/01 Javascript
微信小程序云开发实现云数据库读写权限
2019/05/17 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
vue跳转页面的几种方法(推荐)
2020/03/26 Javascript
Vue实现跑马灯效果
2020/05/25 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
如何处理Python3.4 使用pymssql 乱码问题
2016/01/08 Python
Python 描述符(Descriptor)入门
2016/11/20 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python3匿名函数用法示例
2018/07/25 Python
PyTorch中的C++扩展实现
2020/04/02 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
世界上最大的罕见唱片、CD和音乐纪念品网上商店:991.com
2018/05/03 全球购物
POS解决方案:MUNBYN(热敏打印机、条形码扫描仪)
2020/06/09 全球购物
教师专业自荐信
2014/05/31 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
中职毕业生自我鉴定
2014/09/13 职场文书
出纳工作检讨书
2014/10/18 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
2014年居委会工作总结
2014/12/09 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书