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和libnmapd,提取Nmap扫描结果
Aug 23 Python
Python实现base64编码的图片保存到本地功能示例
Jun 22 Python
在Python中使用defaultdict初始化字典以及应用方法
Oct 31 Python
face++与python实现人脸识别签到(考勤)功能
Aug 28 Python
python elasticsearch环境搭建详解
Sep 02 Python
python中time库的实例使用方法
Oct 31 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
jupyter notebook tensorflow打印device信息实例
Apr 20 Python
python2.7使用scapy发送syn实例
May 05 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 Python
Pandas 数据编码的十种方法
Apr 20 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自定义加密与解密程序实例
2014/12/31 PHP
zend framework重定向方法小结
2016/05/28 PHP
PHP获取不了React Native Fecth参数的解决办法
2016/08/26 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
javascript利用初始化数据装配模版的实现代码
2010/11/17 Javascript
jQuery 过滤方法filter()选择具有特殊属性的元素
2014/06/15 Javascript
使用node.js 制作网站前台后台
2014/11/13 Javascript
Windows系统下使用Sublime搭建nodejs环境
2015/04/13 NodeJs
基于jQuery实现select下拉选择可输入附源码下载
2016/02/03 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
Angularjs2不同组件间的通信实例代码
2017/05/06 Javascript
jQuery操作之效果详解
2017/05/19 jQuery
详解vue2.0+vue-video-player实现hls播放全过程
2018/03/02 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
vue自定义指令的创建和使用方法实例分析
2018/12/04 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
详解Typescript 内置的模块导入兼容方式
2020/05/31 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python批量修改文件后缀示例代码分享
2013/12/24 Python
C#返回当前系统所有可用驱动器符号的方法
2015/04/18 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
python绘制散点图并标记序号的方法
2018/12/11 Python
OpenCV 边缘检测
2019/07/10 Python
Django发送邮件功能实例详解
2019/09/02 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
python类中super() 的使用解析
2019/12/19 Python
目标管理责任书
2014/04/15 职场文书
幼儿园中班下学期评语
2014/04/18 职场文书
商场促销活动总结
2014/07/10 职场文书
女生抽烟检讨书
2014/10/05 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
2015年安全教育月活动总结
2015/03/26 职场文书