from abc import ABC, abstractmethod
from olc.bean.match_wrapper import MatchWrapper
from olc.bean.olc_config_rule import FlowPolicy
class Limit(ABC):
@abstractmethod
def get_match_wrapper(self) -> MatchWrapper[FlowPolicy]:
"""
获取该限速器的匹配规则
:return:
"""
pass
@abstractmethod
def try_acquire(self, token_number: int) -> bool:
"""
尝试获取令牌
:param token_number: 获取令牌数目
:return: 是否成功
"""
pass
@abstractmethod
def pre_check(self, token_number: int) -> bool:
"""
提前检查
:param token_number:
:return:
"""
pass
@abstractmethod
def roll_back(self, token_number: int):
"""
回滚令牌
:param token_number:
:return:
"""
pass
@abstractmethod
def dec_token(self, token_number: int):
"""
强制扣减一定数目令牌, 不足的直接扣减至0, 负数为增加
:param token_number:
:return:
"""
pass
async def async_try_acquire(self, token_number: int) -> bool:
"""默认实现:直接代理同步 try_acquire。
若子类实现含阻塞 I/O,必须显式覆盖此方法。
"""
return self.try_acquire(token_number)
async def async_pre_check(self, token_number: int) -> bool:
"""默认实现:直接代理同步 try_acquire。
若子类实现含阻塞 I/O,必须显式覆盖此方法。
"""
return self.pre_check(token_number)
async def async_roll_back(self, token_number: int):
"""默认实现:直接代理同步 try_acquire。
若子类实现含阻塞 I/O,必须显式覆盖此方法。
"""
self.roll_back(token_number)
async def async_dec_token(self, token_number: int):
"""默认实现:直接代理同步 try_acquire。
若子类实现含阻塞 I/O,必须显式覆盖此方法。
"""
self.dec_token(token_number)