服务进程
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,设置验证码(或认证码authkey)‘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')
#任务进程连接前输出:
put task 4665... put task 9480... put task 9136... put task 985... put task 4288... put task 6584... put task 4208... put task 6737... put task 9565... put task 8505... try get results...
#任务进程连接后汇总输出:
put task 4263... put task 6298... put task 6383... put task 180... put task 7008... put task 9011... put task 9998... put task 6270... put task 3352... put task 2519... try get results... result:4263 * 4263 = 18173169 result:6298 * 6298 = 39664804 result:6383 * 6383 = 40742689 result:180 * 180 = 32400 result:7008 * 7008 = 49112064 result:9011 * 9011 = 81198121 result:9998 * 9998 = 99960004 result:6270 * 6270 = 39312900 result:3352 * 3352 = 11235904 result:2519 * 2519 = 6345361 master exit
任务进程
import sys,time,queue from multiprocessing.managers import BaseManager #创建类似的QueueManager class QueueManager(BaseManager): pass #由于这个QueueManager只从网络获取Queue,所以注册时只提供名字 QueueManager.register('get_task_queue') QueueManager.register('get_result_queue') #连接到服务器,即运行 服务进程 的机器 # server_addr = '127.0.0.1' #本机 server_addr = '192.168.254.118' #虚拟机系统IP print('connect to server %s...'% server_addr) #端口和验证码注意保持和 服务进程 设置的完全一致 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')
#任务进程运行结果:
connect to server 192.168.254.118... run task 4263 * 4263 run task 6298 * 6298 run task 6383 * 6383 run task 180 * 180 run task 7008 * 7008 run task 9011 * 9011 run task 9998 * 9998 run task 6270 * 6270 run task 3352 * 3352 run task 2519 * 2519 worker exit