python分布式进程

转自廖雪峰的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

猜你喜欢

转载自blog.csdn.net/qq_21294095/article/details/85214476
今日推荐