我在使用电报api的节流阀时遇到了一些问题。
基本上,问题是如果请求的数量超过了我的限制,当最小值超过时,消息就会被随机发送。
这是我正在使用的油门的代码(在一些github上找到的)
class Throttler:
def __init__(self, rate_limit, period=1.0, retry_interval=0.01):
self.rate_limit = rate_limit
self.period = period
self.retry_interval = retry_interval
self._task_logs = deque()
def flush(self):
now = time.time()
while self._task_logs:
if now - self._task_logs[0] > self.period:
self._task_logs.popleft()
else:
break
async def acquire(self):
while True:
self.flush()
if len(self._task_logs) < self.rate_limit:
break
await asyncio.sleep(self.retry_interval)
self._task_logs.append(time.time())
async def __aenter__(self):
await self.acquire()
async def __aexit__(self, exc_type, exc, tb):
passI can use this as following
throttler = Throttler(rate_limit=30, period=10)
async with throttler:
await sendmessage(message)发布于 2020-08-31 23:37:12
我发现解决这个问题的最好方法是对油门使用不同的算法。
我在上面使用的节流器总是随机发送消息,因为在初始突发之后,消息将被困在队列中,当时间过去时,asyncio将一次性释放所有消息。
我发现解决这个问题的最好方法是使用所谓的LeakyBucket算法。我使用以下答案实现了一个LeakyBucket自己的https://stackoverflow.com/a/45502319/7055234
https://stackoverflow.com/questions/59388056
复制相似问题