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使用filetype精确判断文件类型
Jul 02 Python
linux环境下的python安装过程图解(含setuptools)
Nov 22 Python
Python高级用法总结
May 26 Python
Python连接Mssql基础教程之Python库pymssql
Sep 16 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
python实现单链表的方法示例
Sep 03 Python
Python如何获取文件指定行的内容
May 27 Python
自学python用什么系统好
Jun 23 Python
pycharm专业版远程登录服务器的详细教程
Sep 15 Python
用python写一个带有gui界面的密码生成器
Nov 06 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
老生常谈PHP 文件写入和读取(必看篇)
2017/05/22 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
JavaScript 继承详解(三)
2009/07/13 Javascript
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
JS实现完全语义化的网页选项卡效果代码
2015/09/15 Javascript
深入理解jQuery中的事件冒泡
2016/05/24 Javascript
微信jssdk用法汇总
2016/07/16 Javascript
Ajax+FormData+javascript实现无刷新表单信息提交
2016/10/24 Javascript
Javascript 高性能之递归,迭代,查表法详解及实例
2017/01/08 Javascript
纯js三维数组实现三级联动效果
2017/02/07 Javascript
JavaScript实现前端分页控件
2017/04/19 Javascript
vuejs父子组件之间数据交互详解
2017/08/09 Javascript
前端常见跨域解决方案(全)
2017/09/19 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
vuex提交state&&实时监听state数据的改变方法
2018/09/16 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
python 查找文件夹下所有文件 实现代码
2009/07/01 Python
解决每次打开pycharm直接进入项目的问题
2018/10/28 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
python opencv判断图像是否为空的实例
2019/01/26 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
keras绘制acc和loss曲线图实例
2020/06/15 Python
解决pip install psycopg2出错问题
2020/07/09 Python
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
2020/08/18 Python
python 常见的反爬虫策略
2020/09/27 Python
CSS3轻松实现清新 Loading 效果的简单实例
2016/06/06 HTML / CSS
使用数据结构给女朋友写个Html5走迷宫游戏
2019/11/26 HTML / CSS
个人找工作的自我评价
2013/10/17 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
基层党支部承诺书
2015/04/30 职场文书
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
详解Go语言Slice作为函数参数的使用
2021/07/02 Golang