Loading

python 分布式进程设计

在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

task_master.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import random, time, queue
from multiprocessing.managers import BasesManager
#发送任务队列:
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,验证码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.')

task_worker.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
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的机器
server_addr = '127.0.0.1'
print('Connect to server %s...' % server_addr)
#端口和验证码注意保持与task_Master设置一致
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))
        time.sleep(1)
        result.put(r)
    except Queue.Empty:
        print('task queue is empty.')
#处理结果
print('worker exit.')
posted @ 2018-07-10 17:19  摇橙子  阅读(236)  评论(0编辑  收藏  举报