#-*-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.')