加权轮询 python实现

本文介绍了一种基于服务器权重的轮询调度算法实现。通过计算服务器权重的最大公约数确定调度步长,并根据服务器权重分配请求,实现了负载均衡。文章详细展示了算法的Python实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、首先是Server

'''
Created on 2016年12月23日

@author: 玩代码的坏小孩
'''

class Server(object):
    '''
    classdocs
    '''


    def __init__(self, name,weight):
        '''
        Constructor
        '''
        self.name=name
        self.weight=weight
        self.visitCount=weight
        

2、主程序

#-*-coding:utf-8-*-
'''
Created on 2016年12月23日

@author: zhangkai
'''
import math
from com.hhdys.bean.Server import Server

class WeightRound(object):
    '''
    servers #全局变量 服务器列表
    gcd #最大公约数
    serversNum #服务器数量
    '''
    


    def __init__(self):
        '''
        Constructor
        '''
        self.curIndex=0
        self.servers=list()
        self.curServer=0
        server1=Server("A",4)
        server2=Server("B",4)
        server3=Server("C",3)
        self.servers.append(server1)
        self.servers.append(server2)
        self.servers.append(server3)
        self.servers.append(Server("D",1))
        self.getMaxGcd()
        print(str.format("Max gcd is {0}",self.gcd))
        self.getTotalWeight()
        print(str.format("The total weight of the servsers is {0}",self.weightTotal))
        
        
    def getMaxGcd(self):
        '''
        获取最大公约数
        '''
        tempGcd=0
        for server in self.servers:
            weight=server.weight
            if tempGcd==0:
                tempGcd=weight
                continue
            tempGcd=math.gcd(tempGcd, weight)
        self.gcd=tempGcd
    def getTotalWeight(self):
        '''
        总权值
        '''
        self.weightTotal=0
        for server in self.servers:
            self.weightTotal+=server.weight
        self.weightTotal/=self.gcd
    def getServer(self):
        '''
        获取服务器
        '''
        serversNum=len(self.servers)
        if(self.curIndex>=self.weightTotal): #超过一次轮询
                    self.curIndex=0
                    self.curServer=0
                    for serverItem in self.servers:
                        print("reset visitCount========"+serverItem.name)
                        serverItem.visitCount=serverItem.weight
                        
        server=self.servers[self.curServer]
        if self.curIndex<self.weightTotal and server.visitCount>0: #机器可用
            
            server.visitCount-=self.gcd
            print("Ther server is"+server.name)
            self.curIndex+=1
            self.curServer+=1
            if self.curServer>=serversNum:
                self.curServer=0
            return server
        
        while True:#机器已打权重上限 轮询下一台机器
            self.curServer+=1
            if self.curServer>=serversNum:
                self.curServer=0
            server=self.servers[self.curServer]
            if self.curIndex<self.weightTotal and server.visitCount>0: #机器可用
                server.visitCount-=self.gcd
                print("Ther server is"+server.name)
                self.curIndex+=1
                self.curServer+=1
                if self.curServer>=serversNum:
                    self.curServer=0
                return server 
                
            
        
        
if __name__=="__main__":
    print("begin====")
    wr=WeightRound()
    for i in range(20):
        wr.getServer()
    print("end=====")
    
    

3、概述 3. 1. 首先每个服务器都配置有一个权重,求出所有服务器的权重和,作为一个轮询的周期。
3. 2. 然后求出所有权重的最大公约数,作为每一个服务器在每次请求的时候减去的步长。代码中visitCo代表这个服务器还能提供几个访问步长。 3. 3. 有一个计数器来标记当前请求的服务器,如果当前服务器可用(visitCount>0,此处未考虑服务器状态比如挂掉),并且计数器没有大于权重和,则返回此服务器。如果此服务器不可用,计数器+1,轮询下一个服务器,知道服务器可用,返回可用服务器。如果计数器大于权重和,表明一个轮询周期结束,重置计数器及每台机器可访问计数。

转载于:https://my.oschina.net/hhdys412/blog/811274

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值