• [spring 并行6]分布式


    分布式篇 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

  • 相关阅读:
    linux查看用户组所有成员
    navicat for mysql 在Mac上安装后没有连接列表,就是左边的那一列连接项目怎么办?
    mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
    phpcms多站点表单统一到主站点管理的解决方案
    thinkphp5.0 session驱动方式问题汇总
    Python__开启进程的两种方式
    Python并发编程之操作系统理论部分
    操作系统简介
    Python__基于udp的套接字
    网络编程1
  • 原文地址:https://www.cnblogs.com/maplesnow/p/12044382.html
Copyright © 2020-2023  润新知