Python 分布式进程

时间:2022-08-28 21:27:12
#-*-coding:utf-8-*-
'''分布式进程指的是将Process进程分不到多台机器上,充分利用多台机器的性能完成复杂的任务'''
#服务器端
#---------------------------------------Linux版----------------------------------------------
# import random,time,Queue
# from multiprocessing.managers import BaseManager
# #一、建立task_queue和result_queue用来存放任务和结果
# task_queue=Queue.Queue()
# result_queue=Queue.Queue()
# class Queuemanger(BaseManager):
#     pass
# #二、把创建的两个队列注册在网络上,利用reister方法,clallble参数关联了Queue对象,将Queue对象在网络中暴露
# Queuemanger.register('get_task_queue',callable=lambda:task_queue)
# Queuemanger.register('get_result_queue',callable=lambda:result_queue)
# #三、绑定端口8001,设置端口口令;admin,相当于对象的初始化
# manager=Queuemanger(address=('',8001),authkey='admin')
# #四、启动管理监听信息通道
# manager.start()
# #五、通过管理实例的方法获得通过网络访问的Queue对象
# task=manager.get_task_queue()
# result=manager.get_result_queue()
# #六、添加任务
# for url in ["ImageUrl_"+str(i) for i in range(10)]:
#     print("put task %s..."%url)
#     task.put(url)
# #获取返回结果
# print("try get result...")
# for i in range(10):
#     print("result is %s"%result.get(timeout=10))
# #关闭管理
# manager.shutdown()
#--------------------------------------------------Windows版-----------------------------------
#taskManager for Windows
import Queue
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support
#任务个数
task_number=20
#定义收发队列
task_queue=Queue.Queue(task_number)
result_queue=Queue.Queue(task_number)
def get_task():
    return task_queue
def get_result():
    return task_queue()
#创建类似的QueueManager
class QueueManager(BaseManager):
    pass
def win_run():
    #windows下绑定调用接口不能使用lambda所以只能先定义函数再绑定
    QueueManager.register('get_task_queue',callable=get_task)
    QueueManager.register('get_result_queue',callable=get_result)
    #绑定端口并设置验证口令,Windows下需要填写IP地址,linux下不填写默认使用本地IP地址
    manager=QueueManager(address=('127.0.0.1',8001),authkey='admin')
    #启动
    manager.start()
    try:
        #通过网络获取任务队列和结果队列
        task=manager.get_task_queue()
        result=manager.get_result_queue()
        #添加任务
        for url in["ImageUrl_"+str(i) for i in range(10)]:
            print('put  task %s... '%url)
            task.put(url)
        print('try get result...')
        for i in range(10):
            print('result is %s '%result.get(timeout=10))
    except Exception as e:
        print('Manager error:%s'%e)
    finally:
        #不论程序执行成功或是失败finally都会执行,即一定要将管道关闭,否则汇报错误
        manager.shutdown()
if __name__=="__name__":
    #windows下多进程可能会有问题,添加以下代码可以缓解
    freeze_support()
    win_run()

 #客户端

#-*-coding:utf-8-*-

#任务进程TaskWorker.py
import time
from multiprocessing.managers import BaseManager
#创建类似的QueueManager:
class QueueManager(BaseManager):
    pass
#一、使用QueueManger注册用于获取Queue的方法名称
QueueManager.register('get_task_queue')
QueueManager.register('get_result_queue')
#二、链接到服务器
server_addr='127.0.0.1'
print('Connect to server %s...'%server_addr)
#端口和验证口令需要与服务器保持一致
m=QueueManager(address=(server_addr,8001),authkey='admin')
#从网络链接
m.connect()
#三、获取Queue的对象
task=m.get_task_queue()
result=m.get_result_queue()
#四、从 task队列获取任务,并把结果写入result
while(not task.empty()):
    image_url=task.get(True,timeout=5)
    print('run task download %s...'%image_url)
    time.sleep(1)
    result.put('%s--->sucess'%image_url)
print('worker exit.')