python分布式编程实现过程解析

作者:Mars.wang 时间:2023-11-10 21:13:48 

分布式编程的难点在于:

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.')

来源:https://www.cnblogs.com/wangbin2188/p/9923190.html

标签:python,分布,式,编程
0
投稿

猜你喜欢

  • SQL 新增/修改 表字段列的类型等

    2024-01-20 01:20:59
  • 将数据集制作成VOC数据集格式的实例

    2023-05-16 06:00:15
  • Python基于OpenCV的视频图像处理详解

    2021-02-06 19:57:37
  • Python Web版语音合成实例详解

    2021-11-28 04:37:20
  • 用Python写一个无界面的2048小游戏

    2022-02-12 11:18:23
  • Python爬取成语接龙类网站

    2022-04-09 07:29:58
  • Python 弹窗设计小人发射爱心

    2021-07-16 14:41:01
  • Python内存映射文件读写方式

    2023-07-07 23:32:36
  • asp使用 sql_dmo 给表添加索引

    2010-03-17 20:57:00
  • Python之Matplotlib文字与注释的使用方法

    2022-09-09 10:36:51
  • python获取网页中所有图片并筛选指定分辨率的方法

    2021-07-28 04:57:23
  • mysql中limit查询踩坑实战记录

    2024-01-16 13:38:45
  • 浅谈Python type的使用

    2021-05-17 05:58:59
  • server application error--IIS故障

    2009-06-11 12:50:00
  • vue 路由懒加载详情

    2024-04-28 09:31:25
  • 浅谈pytorch中stack和cat的及to_tensor的坑

    2022-12-14 11:53:23
  • python中列表和元组的区别

    2022-05-21 16:06:00
  • 详解Vue项目中出现Loading chunk {n} failed问题的解决方法

    2024-04-30 10:16:03
  • python实现图片彩色转化为素描

    2021-12-02 03:57:36
  • 详解Python_shutil模块

    2023-06-24 00:32:19
  • asp之家 网络编程 m.aspxhome.com