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监控网卡流量并使用graphite绘图的示例
Apr 27 Python
Python Web框架Flask信号机制(signals)介绍
Jan 01 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
利用Python实现网络测试的脚本分享
May 26 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
浅谈解除装饰器作用(python3新增)
Oct 15 Python
Python中shapefile转换geojson的示例
Jan 03 Python
opencv python图像梯度实例详解
Feb 04 Python
python3.7.3版本和django2.2.3版本是否可以兼容
Sep 01 Python
python opencv通过按键采集图片源码
May 20 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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使用mkdir创建多级目录入门例子
2014/05/10 PHP
thinkPHP5实现数据库添加内容的方法
2017/10/25 PHP
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
解析javascript 浏览器关闭事件
2013/07/08 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
JS获取随机数函数可自定义最小值最大值
2014/05/08 Javascript
javascript实现在某个元素上阻止鼠标右键事件的方法和实例
2014/08/12 Javascript
javascript中Object使用详解
2015/01/26 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
微信小程序页面开发注意事项整理
2017/05/18 Javascript
旺旺在线客服代码 旺旺客服代码生成器
2018/01/09 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
typescript nodejs 依赖注入实现方法代码详解
2019/07/21 NodeJs
js实现计算器功能
2020/08/10 Javascript
vue设置全局访问接口API地址操作
2020/08/14 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
关于uniApp editor微信滑动问题
2021/01/15 Javascript
jQuery是用来干什么的 jquery其实就是一个js框架
2021/02/04 jQuery
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
Python映射拆分操作符用法实例
2015/05/19 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
Python学习笔记之图片人脸检测识别实例教程
2019/03/06 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
完美解决keras 读取多个hdf5文件进行训练的问题
2020/07/01 Python
CSS3使用transition实现的鼠标悬停淡入淡出
2015/01/09 HTML / CSS
好人好事事迹材料
2014/02/12 职场文书
幼儿园教师工作感言
2014/02/15 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
公安纪律作风整顿剖析材料
2014/10/10 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
探究Mysql模糊查询是否区分大小写
2021/06/11 MySQL