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

posted @ 2021-08-17 15:25  该显示昵称已被使用了  阅读(35)  评论(0编辑  收藏  举报