python分布式服务器_Python 分布式进程

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值