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自动化测试实例解析
Sep 28 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
Python学生成绩管理系统简洁版
Apr 05 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python 实现分页显示从es中获取的数据方法
Dec 26 Python
selenium+python环境配置教程详解
May 28 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
Jul 07 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
python单向循环链表原理与实现方法示例
Dec 03 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
python re模块常见用法例举
Mar 01 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 2000下使用ISAPI方式安装PHP
2006/09/05 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
PHP写MySQL数据 实现代码
2009/06/15 PHP
php实现将任意进制数转换成10进制的方法
2015/04/17 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
javascript DOM编程实例(智播客学习)
2009/11/23 Javascript
javascript 函数速查表
2010/02/07 Javascript
JS Pro-深入面向对象的程序设计之继承的详解
2013/05/07 Javascript
原生javascript和jquery判断浏览器版本等信息
2013/07/04 Javascript
jquery判断元素是否隐藏的多种方法
2014/05/06 Javascript
javascript中call,apply,bind的用法对比分析
2015/02/12 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
2017/05/03 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
Node.js API详解之 V8模块用法实例分析
2020/06/05 Javascript
Windows和Linux下使用Python访问SqlServer的方法介绍
2015/03/10 Python
Python实现简单字典树的方法
2016/04/29 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
对python3新增的byte类型详解
2018/12/04 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
django+echart数据动态显示的例子
2019/08/12 Python
Python paramiko模块使用解析(实现ssh)
2019/08/30 Python
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
2013/09/02 HTML / CSS
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
Gina Bacconi官网:吉娜贝康尼连衣裙和礼服
2018/04/24 全球购物
大学生年度自我鉴定
2013/10/31 职场文书
简历中求职的个人自我评价
2013/12/03 职场文书
大学系主任推荐信范文
2013/12/24 职场文书
环境整治工作方案
2014/05/18 职场文书
营业员岗位职责范本
2015/04/14 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL