zoukankan      html  css  js  c++  java
  • python分布式版本二分法验证

    1. 思路1,master等待远端返回结果
    
    from multiprocessing import Pool
    import os, time, random
    
    
    # 在远端执行的任务进程,,hang住等待返回
    def long_time_task(ip,url):
        print('Run task %s-%s (%s)...' % (ip, url, os.getpid()))
        start = time.time()
        time.sleep(random.random() * 30)
        end = time.time()
        print('Task %s runs %0.2f seconds.' % (ip, (end - start)))
        return True  # 版本验证通过返回true
    
    
    if __name__=='__main__':
        print('Parent process %s.' % os.getpid())
        url_list = [1,2,3,4,5,6,7,8]   # 版本list,stat[0],end[-1]
        p = Pool(4)  # 远端执行的节点数
        # 根据节点数二分法取出节点数个版本待验证
        for i in range(5):
            p.apply_async(long_time_task, args=(i,'url:1'))  # 传入ip地址,和版本url
        print('Waiting for all subprocesses done...')
        p.close()
        p.join()   # 所有进程都完成后,根据返回结果更新二分法的start和end
        print('All subprocesses done.')
    
    1. 思路2,QueueManager通信
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    import random, time, queue
    from multiprocessing.managers import BaseManager
    
    # 发送任务的队列:
    task_queue = queue.Queue()
    # 接收结果的队列:
    result_queue = queue.Queue()
    
    
    # 增加如下的函数以适应windows ,【PicklingError】
    def task_queue_fun():
        return task_queue
    
    
    def result_queue_fun():
        return result_queue
        # return queue.Queue()  # 这样不行
    
    
    # 从BaseManager继承的QueueManager:
    class QueueManager(BaseManager):
        pass
    
    
    if __name__ == '__main__':
    
        # 把两个Queue都注册到网络上, callable参数关联了Queue对象:
        # 修改如下的函数,以适应windows环境
        # QueueManager.register('get_task_queue', callable=lambda: task_queue)
        # QueueManager.register('get_result_queue', callable=lambda: result_queue)
        QueueManager.register('get_task_queue', callable=task_queue_fun)
        QueueManager.register('get_result_queue', callable=result_queue_fun)
        # 绑定端口5000, 设置验证码'abc':
        manager = QueueManager(address=('127.0.0.1', 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.')
    
    
  • 相关阅读:
    [翻译] C++ STL容器参考手册 (总册)
    仿淘宝TAB切换搜索框
    超简单TAB切换
    程序员和项目经理驰骋职场的故事
    eclispse 闪退问题解决
    Jennic 之API学习
    JN5139 DIO中断机制
    HTTP Error503 .The service is unavailable
    纯CSS3动画:一棵跳舞的树
    【学习笔记】python 简单创建新建一个网络客户端,并返回相关的信息
  • 原文地址:https://www.cnblogs.com/amize/p/15152498.html
Copyright © 2011-2022 走看看