什么是一种好的速率限制算法?

178

我需要一些伪代码,或者更好的是Python代码。 我正在尝试为Python IRC机器人实现一个速率限制队列,它部分工作正常,但如果有人触发的消息少于限制(例如,速率限制为每8秒5条消息,而该人只触发了4条),并且下一次触发在8秒之后(例如,16秒后),机器人会发送消息,但队列变满了,机器人将等待8秒,即使不需要等待,因为8秒时间已过。

12个回答

0
这个怎么样?
long check_time = System.currentTimeMillis();
int msgs_sent_count = 0;

private boolean isRateLimited(int msgs_per_sec) {
    if (System.currentTimeMillis() - check_time > 1000) {
        check_time = System.currentTimeMillis();
        msgs_sent_count = 0;
    }

    if (msgs_sent_count > (msgs_per_sec - 1)) {
        return true;
    } else {
        msgs_sent_count++;
    }

    return false;
}

0
Java语法,主要思想:不要计算迭代次数,而是计算跳跃时间。记住上一次跳跃时间,等待所需时间不超过跳跃速率。
public static void limitRate(int rate, AtomicLong leapTime, ReentrantLock rateLock) {
    long targetLeapTime = 1_000_000_000 / rate;
    rateLock.lock();
    try {
        long timeSnapshot = nanoTime();
        long waitTime = targetLeapTime - (timeSnapshot - leapTime.get());
        if (waitTime > 0) {

            LockSupport.parkNanos(waitTime);

            leapTime.set(timeSnapshot + waitTime);
        } else {
            leapTime.set(timeSnapshot);
        }
    } finally {
        rateLock.unlock();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接