【问题标题】:Does SemaphoreSlim guarantee entry when there are constantly more than one callers waiting for entry当不断有多个呼叫者等待进入时,SemaphoreSlim 是否保证进入
【发布时间】:2019-08-29 09:59:05
【问题描述】:

假设我有一个 SemaphoreSlim 限制对外部 API 的并发调用,如下所示:

private static readonly SemaphoreSlim semaphoreSlim = new SemaphoreSlim(10);

public async Task<HttpResponseMessage> SendApiRequest(HttpRequestMessage request)
{
    using (await semaphoreSlim.WaitAsync())
        return await SendRequestToAPI(request);
}

如果对 API 的调用次数是这样的,即没有长时间累积等待的调用者,但始终有至少两个调用者在等待,是否保证最终让所有调用者通过?或者当另一个调用者释放信号量时,一个请求可能是“不幸的”并且永远不会被选中进入?

【问题讨论】:

  • 如果您对 为什么 SemaphoreSlim(和其他同步原语)不“公平”感兴趣,have a read of this article by Joe Duffy
  • 你错过了一个释放的电话......所以你的电话一定会永远等待

标签: c# .net async-await locking semaphore


【解决方案1】:

根据documentation

如果多个线程被阻塞,则没有保证顺序,例如 FIFO 或 LIFO,控制线程何时进入信号量。

所以是的,一个请求可能不走运并且永远不会被选中。

【讨论】:

  • 这不准确。文档说明不能保证顺序......这并不是说信号量在此过程中“可能会丢失”一些请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多