分布式Master进程
# task_master.py import random, queue from multiprocessing.managers import BaseManager #发送任务的队列 data_queue = queue.Queue() #接受结果的队列 result_queue = queue.Queue() #从BaseManager继承的QueueManager class QueueManager(BaseManager): pass def return_data_queue(): global data_queue return data_queue def return_result_queue(): global result_queue return result_queue def run(): #把两个Queue都注册到网络上, callable参数关联了Queue对象 QueueManager.register("get_data_queue", callable=return_data_queue) QueueManager.register("get_result_queue", callable=return_result_queue) #还可从实例中注册 #manager.register("get_data_queue", callable=return_data_queue) #manager.register("get_result_queue", callable=return_result_queue) #绑定端口5000, 设置验证码'abc' manager = QueueManager(address=("127.0.0.1", 5000), authkey=b"shabi") manager.start() # 获得通过网络访问的Queue对象 data = manager.get_data_queue() result = manager.get_result_queue() #放入任务 for i in range(10): n = random.randint(0,100) print("put {} in data".format(n)) data.put(n) #读取结果 print("try get results...") for i in range(10): r = result.get(timeout=10) print("result is {}".format(r)) manager.shutdown() print("master exit") if __name__ == '__main__': run() 分布式Worker进程
# task_worker.py import time from multiprocessing.managers import BaseManager class QueueManager(BaseManager): pass # 由于这个QueueManager只从网络上获取Queue,所以注册时只提供名字: QueueManager.register("get_data_queue") QueueManager.register("get_result_queue") # 连接到服务器,也就是运行task_master.py的机器: server_addr = "127.0.0.1" print("connect to server {}".format(server_addr)) m = QueueManager(address=(server_addr, 5000),authkey=b"shabi") m.connect() # 获取Queue的对象: data = m.get_data_queue() result = m.get_result_queue() # 从task队列取任务,并把结果写入result队列 for i in range(10): try: n = data.get(timeout=1) print("run task {} * {}".format(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")