转自廖雪峰的python教程,因为是在windows上编程,所以代码会和原文有一些出入。
master.py
from multiprocessing.managers import BaseManager
import random, time, queue
task_queue = queue.Queue() #任务队列
result_queue = queue.Queue() #结果队列
class MyManager(BaseManager):
pass
def return_task_queue():
global task_queue
return task_queue
def return_result_queue():
global result_queue
return result_queue
if __name__ == '__main__':
#发布到网络上
MyManager.register('tasks', callable= return_task_queue)
MyManager.register('results', callable= return_result_queue)
manager = MyManager(address=('127.0.0.1',5000), authkey=b'abc') #在本机5000端口上创建一个Manager 口令为abc
manager.start()
task = manager.tasks() #不能直接去操作上面的task_queue了,需要通过网络获取
result = manager.results()
for i in range(1,10):
print('发布任务,%d' % i)
task.put(i)
for i in range(1,10):
r = result.get(timeout=10)
print('结果',r)
manager.shutdown()
worker.py
from multiprocessing.managers import BaseManager
import random, time, queue
class MyManager(BaseManager):
pass
MyManager.register('tasks') #获取master发布的任务
MyManager.register('results')
manager = MyManager(address=('127.0.0.1', 5000), authkey=b'abc')
manager.connect() #连接到master去
task = manager.tasks()
result = manager.results()
for i in range(1,10):
try:
n = task.get(timeout=1)
print('执行任务,',n)
n = n * n
result.put(n)
except queue.Empty:
print('task queue is Empty')
先运行master.py 在master的命令行就会显示发布任务,然后等着worker.py处理返回结果
Output:
发布任务,1
发布任务,2
发布任务,3
发布任务,4
发布任务,5
发布任务,6
发布任务,7
发布任务,8
发布任务,9
再运行worker.py 在worker的命令行会显示以下输出。
Output:
执行任务, 1
执行任务, 2
执行任务, 3
执行任务, 4
执行任务, 5
执行任务, 6
执行任务, 7
执行任务, 8
执行任务, 9
然后master.py也能继续往下走,获取计算结果了。
Output:
发布任务,1
发布任务,2
发布任务,3
发布任务,4
发布任务,5
发布任务,6
发布任务,7
发布任务,8
发布任务,9
结果 1
结果 4
结果 9
结果 16
结果 25
结果 36
结果 49
结果 64
结果 81