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函数返回多个值的示例方法
Dec 04 Python
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
Python模仿POST提交HTTP数据及使用Cookie值的方法
Nov 10 Python
Python的装饰器模式与面向切面编程详解
Jun 21 Python
基于Python的接口测试框架实例
Nov 04 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
Jan 26 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
python判断一个数是否能被另一个整数整除的实例
Dec 12 Python
OpenCV图像颜色反转算法详解
May 13 Python
Django模板获取field的verbose_name实例
May 19 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
使用Python脚本对GiteePages进行一键部署的使用说明
May 27 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
Yii模型操作之criteria查找数据库的方法
2016/07/15 PHP
php解析base64数据生成图片的方法
2016/12/06 PHP
php查找字符串中第一个非0的位置截取
2017/02/27 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP asXML()函数讲解
2019/02/03 PHP
Laravel Validator自定义错误返回提示消息并在前端展示
2019/05/09 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
jQuery Selector选择器小结
2010/05/06 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
jQuery function的正确书写方法
2013/08/02 Javascript
js仿百度贴吧验证码特效实例代码
2014/01/16 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
使用CDN和AJAX加速WordPress中jQuery的加载
2015/12/05 Javascript
js实现页面跳转的五种方法推荐
2016/03/10 Javascript
利用jquery制作滚动到指定位置触发动画
2016/03/26 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
Angular4.x通过路由守卫进行路由重定向实现根据条件跳转到相应的页面(推荐)
2018/05/10 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
使用xampp将angular项目运行在web服务器的教程
2019/09/16 Javascript
[03:55]TI9战队采访——TNC Predator
2019/08/22 DOTA
Python生成随机密码的方法
2017/06/16 Python
使用Python搭建虚拟环境的配置方法
2018/02/28 Python
python实现合并两个排序的链表
2019/03/03 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
Lulu & Georgia官方网站:购买地毯、家具、抱枕、壁纸、床上用品等
2018/03/19 全球购物
酒店员工检讨书
2014/02/18 职场文书
观看信仰心得体会
2014/09/04 职场文书
离职证明标准格式
2014/09/15 职场文书
首席执行官观后感
2015/06/03 职场文书
浅谈如何写好演讲稿?
2019/06/12 职场文书
Mysql数据库索引面试题(程序员基础技能)
2021/05/31 MySQL
什么是SOLID
2022/03/24 Javascript