python并行编程 - 分布式篇

目录1

介绍篇
线程篇
进程篇
异步篇
GPU篇
分布式篇


简述

分布式计算的基本理念是将工作划分为一个一个小任务,分发给多台设备处理,再汇总结果。在分布式计算中,网络中的机器必须要保持可用(延迟误差、意外宕机等等),需要一个持续监控架构


分布式多进程2

multiprocessing的子模块managers还支持把多进程分布在多台机器上,managers模块已经封装好了网络通信的细节

实现方法:我们可以使用managers模块将queue队列通过网络暴露出去,让其它机器访问到这个队列,然后就可以通过它实现数据交换

示例:
服务器通过暴露queue到网络,放入数据到队列,让客户端取出数据处理,再放回结果
服务器代码

# 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 = n*n
        time.sleep(1)
        result.put(r)
    except Queue.Empty:
        print('task queue is empty.')
# 处理结束:
print('worker exit.')

分布式架构库

这篇仅是简单的分布式的简单操作,更多详情,搜索以下的内容作为关键字

使用面向对象模式和远程调用模式实现分布式框架的库,如Celery、SCOOP、Pyro4、RPyC,还有使用MapReduce实现的PyCSP、Disco

Celery:是一个用于管理分布式任务的Python框架
SCOOP:(Scalable Concurrent Operations in Python)用于进行科学计算
Pyro4:(Python Remote Object)远程调用方法,类似于java中远程方法调用(RMI)的库,支持调用远程对象(属于不同进程,或不同机器上)的方法,就好像它是本地对象
PyCSP:是基于通信的顺序进程(communicating sequential processes,简称CSP)的一个Python模块,它是通过消息传递方式构建并发程序的一种编程范式,特点:进程间的消息交换、通过线程使用共享内存、通过通道完成信息交换
Disco:是一个基于谷歌推出的MapReduce框架的Python模块,支持在计算机集群中管理大规模分布式数据



  1. 参考书籍:《Python并行编程手册》 ↩︎

  2. 这段代码完全参考:廖雪峰 -分布式进程 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431929340191970154d52b9d484b88a7b343708fcc60000 ↩︎

猜你喜欢

转载自blog.csdn.net/ZAQ1018472917/article/details/84637568