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中argparse模块用法实例详解
Jun 03 Python
Python打印斐波拉契数列实例
Jul 07 Python
Python实现的基数排序算法原理与用法实例分析
Nov 23 Python
对python使用http、https代理的实例讲解
May 07 Python
python中cPickle类使用方法详解
Aug 27 Python
python使用pygame框架实现推箱子游戏
Nov 20 Python
Python sklearn KFold 生成交叉验证数据集的方法
Dec 11 Python
Python列表(List)知识点总结
Feb 18 Python
python爬虫增加访问量的方法
Aug 22 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
python内置函数sorted()用法深入分析
Oct 08 Python
使用Python爬取小姐姐图片(beautifulsoup法)
Feb 11 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编程实现获取excel文档内容的代码实例
2011/06/28 PHP
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
Yii中CArrayDataProvider和CActiveDataProvider区别实例分析
2016/03/02 PHP
javascript 动态添加表格行
2006/06/22 Javascript
国外Lightbox v2.03.3 最新版 下载
2007/10/17 Javascript
js 代码集(学习js的朋友可以看下)
2009/07/22 Javascript
jQuery 选择器、DOM操作、事件、动画
2010/11/25 Javascript
Javascript中With语句用法实例
2015/05/14 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
js实现图片切换(动画版)
2016/12/25 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
微信小程序methods中定义的方法互相调用的实例代码
2018/08/07 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
Node配合WebSocket做多文件下载以及进度回传
2019/11/07 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
javascript解析json格式的数据方法详解
2020/08/07 Javascript
vue 根据选择的月份动态展示日期对应的星期几
2021/02/06 Vue.js
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
Python实现基于KNN算法的笔迹识别功能详解
2018/07/09 Python
Django模型修改及数据迁移实现解析
2019/08/01 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
selenium WebDriverWait类等待机制的实现
2020/03/18 Python
UGG英国官方网站:UGG UK
2018/02/08 全球购物
联想德国官网:Lenovo Germany
2018/07/04 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物
个人应聘自我评价分享
2013/11/18 职场文书
青春寄语大全
2014/04/09 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
2014年信息中心工作总结
2014/12/17 职场文书
Python基础之进程详解
2021/05/21 Python
Nebula Graph解决风控业务实践
2022/03/31 MySQL
Python OpenCV实现图形检测示例详解
2022/04/08 Python
Python安装使用Scrapy框架
2022/04/12 Python
Java 异步任务计算FutureTask
2022/04/28 Java/Android