分布式篇 1
简述
分布式计算的基本理念是将工作划分为一个一个小任务,分发给多台设备处理,再汇总结果。在分布式计算中,网络中的机器必须要保持可用(延迟误差、意外宕机等等),需要一个持续监控架构
分布式多进程 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
来源:https://www.cnblogs.com/maplesnow/p/12044382.html