实际开发应用中遇到的大型计算任务,一台主机无法进行计算时,可以将问题发布,由多个主机进行计算
from multiprocessing.managers import BaseManager
- 管理端
import random
from multiprocessing.managers import BaseManager
from queue import Queue
import time
#创建任务队列和执行结果的队列
task_queue=Queue()
result_queue=Queue()
#将队列注册到网上
BaseManager.register("get_task_queue",callable=lambda :task_queue)
BaseManager.register("get_result_queue",callable=lambda :result_queue)
#创建一个manager对象并绑定端口号和设置验证码
manager=BaseManager(address=('192.168.122.1',6787),authkey=b'redhat')
#启动manager
manager.start()
#通过网络获取任务队列和结果队列
task=manager.get_task_queue()
result=manager.get_result_queue()
#给任务队列添加任务
for i in range(40):
n = random.randint(1, 100)
print('任务列表加入任务: %s' %(n))
task.put(n)
time.sleep(0.5)
#从结果队列接收结果
for j in range(100):
r = result.get()
print("队列任务的结果: %s" %(r))
#关闭manager对象
manager.shutdown()
- 被管理端1
import queue
from multiprocessing.managers import BaseManager
import time
#同样在网上注册两个队列,且队列名要和管理端保持一致
BaseManager.register('get_task_queue')
BaseManager.register('get_result_queue')
#创建一个管理端下的被管理对象,ip 端口 验证码 必须和管理端保持一致
M=BaseManager(address=('192.168.122.1',6787),authkey=b'redhat')
#连接到管理端
M.connect()
#获取任务队列和结果队列
task=M.get_task_queue()
result=M.get_result_queue()
#读取管理端的任务,并将执行结果返回到结果队列中
for i in range(20):
try:
n=task.get()
print('正在执行任务%s求平方...'%n)
time.sleep(1)
res=n**2
result.put(res)
except queue.Empty:
print('任务队列为空..')
print('任务执行结束....')
- 被管理端2
import queue
from multiprocessing.managers import BaseManager
import time
BaseManager.register('get_task_queue')
BaseManager.register('get_result_queue')
M=BaseManager(address=('192.168.122.1',6787),authkey=b'redhat')
M.connect()
task=M.get_task_queue()
result=M.get_result_queue()
for i in range(20):
try:
n=task.get()
print('正在执行任务%s求平方...'%n)
time.sleep(1)
res=n**2
result.put(res)
except queue.Empty:
print('任务队列为空..')
print('任务执行结束....')