gpt4 book ai didi

c# - 限制对资源的访问

转载 作者:行者123 更新时间:2023-11-30 17:03:35 25 4
gpt4 key购买 nike

我想知道如何为需要 throttle 的 REST 服务实现包装器。该服务的费率仅限于例如“每分钟最多 60 次调用”或类似的。过度使用资源意味着我的客户端被阻塞了很长时间,所以我必须注意不要让这种情况发生,因此我希望包装器本身受到速率限制。

编辑:删除最终想法并将其发布为答案

最佳答案

回答我自己的问题,受@Alex评论的启发,这个解决了时间跨度T内最多N个请求的问题。它将最后N个请求的时间保存在列表(循环缓冲区)中并允许请求如果最早的调用早于 T。

public class Throttler<T>
{
private readonly long[] callTimes;
private int cur;
private readonly Func<T> func;
private readonly TimeSpan interval;
private readonly object padlock = new object();

public Throttler(Func<T> func, int maxCalls, TimeSpan interval)
{
this.func = func;
callTimes = new long[maxCalls];
this.interval = interval;
cur = 0;
}

public T Call()
{
lock (padlock)
{
do
{
long oldestCall = callTimes[(cur + 1)%callTimes.Length];
long now = DateTime.UtcNow.Ticks;
if (now - oldestCall > interval.Ticks)
{
cur = (cur + 1) % callTimes.Length;
callTimes[cur] = now;
return func();
}
int sleepTime = (int)((interval.Ticks - (now - oldestCall))/TimeSpan.TicksPerMillisecond) + 1;
Thread.Sleep(sleepTime);
} while (true);
}
}
}

关于c# - 限制对资源的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18432482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com