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中去空格函数的用法
Aug 21 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
python xlsxwriter创建excel图表的方法
Jun 11 Python
python将字符串以utf-8格式保存在txt文件中的方法
Oct 30 Python
Django框架HttpResponse对象用法实例分析
Nov 01 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
python 爬虫如何实现百度翻译
Nov 16 Python
分享unittest单元测试框架中几种常用的用例加载方法
Dec 02 Python
python 基于selectors库实现文件上传与下载
Dec 31 Python
用Python selenium实现淘宝抢单机器人
Jun 18 Python
Python中super().__init__()测试以及理解
Dec 06 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 数组的指针操作实现代码
2011/02/08 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
php curl模拟post请求小实例
2013/11/13 PHP
程序员的表白神器“520”大声喊出来
2016/05/20 PHP
php批量修改表结构实例
2017/05/24 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
PHP过滤器 filter_has_var() 函数用法实例分析
2020/04/23 PHP
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
Javascript递归打印Document层次关系实例分析
2015/05/15 Javascript
使用jQuery监听DOM元素大小变化
2016/02/24 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
angular-ngSanitize模块-$sanitize服务详解
2017/06/13 Javascript
js学习总结_轮播图之渐隐渐现版(实例讲解)
2017/07/17 Javascript
angularJS开发注意事项
2018/05/26 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
微信小程序如何利用getCurrentPages进行页面传值
2019/07/01 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
基于Electron实现桌面应用开发代码实例
2020/07/07 Javascript
python递归函数绘制分形树的方法
2018/06/22 Python
python读取文件名并改名字的实例
2019/01/07 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
python 利用zmail库发送邮件
2020/09/11 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
幼儿园门卫岗位职责
2014/02/14 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
平安校园建设方案
2014/05/02 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
工作检讨书怎么写
2014/10/10 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
小学优秀教师材料
2014/12/15 职场文书
成绩单评语
2015/01/04 职场文书