分布式进程图解

  • 一个简单例子的图解:


    分布式进程图解_第1张图片
    分布式图解.png
  • task_master.py完整脚本:

# 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_work.py脚本:
  # 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 = '%d * %d = %d' % (n, n, n*n) 
           time.sleep(1) 
           result.put(r) 
    except Queue.Empty: 
           print('task queue is empty.')

 # 处理结束:
print('worker exit.')
  • 运行结果:


    分布式进程图解_第2张图片
    运行结果.png

1 .注意到task_worker.py中根本没有创建Queue的代码,所以,Queue对象存储在task_master.py进程中
2 .而Queue之所以能通过网络访问,就是通过QueueManager实现的。由于QueueManager管理的不止一个Queue,所以,要给每个Queue的网络调用接口起个名字,比如get_task_queue。

你可能感兴趣的:(分布式进程图解)