首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异步FIFO节流器

异步FIFO节流器
EN

Stack Overflow用户
提问于 2019-12-18 16:25:41
回答 1查看 76关注 0票数 0

我在使用电报api的节流阀时遇到了一些问题。

基本上,问题是如果请求的数量超过了我的限制,当最小值超过时,消息就会被随机发送。

这是我正在使用的油门的代码(在一些github上找到的)

代码语言:javascript
复制
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):
        pass
代码语言:javascript
复制
I can use this as following
throttler = Throttler(rate_limit=30, period=10)

async with throttler:
    await sendmessage(message)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-31 23:37:12

我发现解决这个问题的最好方法是对油门使用不同的算法。

我在上面使用的节流器总是随机发送消息,因为在初始突发之后,消息将被困在队列中,当时间过去时,asyncio将一次性释放所有消息。

我发现解决这个问题的最好方法是使用所谓的LeakyBucket算法。我使用以下答案实现了一个LeakyBucket自己的https://stackoverflow.com/a/45502319/7055234

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59388056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档