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