先上代码
#!/usr/bin/env python3 # -*- coding : utf-8 -*- # task_master.py for win7 import random, time, queue from multiprocessing.managers import BaseManager from multiprocessing import freeze_support # 发送任务的队列 task_queue = queue.Queue() # 接收结果的队列 result_queue = queue.Queue() # 从BaseManager集成的QueueManager class QueueManager(BaseManager): pass # win7 不能运行问题 用于替换lambda def return_task_queue (): global task_queue return task_queue def return_result_queue (): global result_queue return result_queue # win7 问题 需要把代码放入函数中, 原因不明 def test (): # 把两个Queue都注册到网络上, callable参数关联了Queue对象 : # QueueManager.register('get_task_queue', callable=lambda: task_queue) # QueueManager.register('get_result_queue', callable=lambda: result_queue) QueueManager.register('get_task_queue', callable=return_task_queue) QueueManager.register('get_result_queue', callable=return_result_queue) # 绑定端口5000, 设置验证码'abc' #manager = QueueManager(address=('', 5000), authkey=b'abc') # win7需要写ip地址 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 result...') for i in range(10): # 这里我自己加了异常捕获 # 运行这个后应该接着在另一个cmd中运行 task_worker.py, 不然一直获取不到数据 try: r = result.get(timeout = 5) print('Result: %s' % r) except queue.Empty: # 老师的是Queue.Empty 我这里报错了, 改为 queue.Empty print('result queue is empty.') # 关闭 manager.shutdown() print('master exit.') if __name__ == '__main__': freeze_support() test()
#!/usr/bin/env python3 # -*- coding : utf-8 -*- # task_worker.py for win7 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') # 从网络连接: 捕获一下吧 比较好看 try: m.connect() except : print('请先启动task_master.py!') sys.exit("sorry, goodbye!"); # 获取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:# 老师的是Queue.Empty 我这里报错了, 改为 queue.Empty print('task queue is empty.') # 处理结果: print('worker exit...') if __name__ == '__main__': pass
基本上都写了注释了, 感谢 @missingmaria 参考 http://bbs.csdn.net/topics/390869705/ 23楼 以及 @木可堂主爱早起 的回答 感谢廖老师!
整了半天,受教了
Sign in to make a reply
gylpnj
先上代码
基本上都写了注释了, 感谢 @missingmaria 参考 http://bbs.csdn.net/topics/390869705/ 23楼 以及 @木可堂主爱早起 的回答 感谢廖老师!