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