【发布时间】:2013-11-07 23:11:02
【问题描述】:
Go 中的信号量是通过通道实现的:
一个例子是这样的: https://sites.google.com/site/gopatterns/concurrency/semaphores
上下文:
我们有几百台服务器,并且有一些共享资源要限制访问。因此,对于给定的资源,我们希望使用信号量来限制这些服务器只能访问 5 个并发访问。为此,我们计划使用锁定服务器。当一台机器访问资源时,它会首先向锁服务器注册它正在通过密钥访问资源。然后当它完成时,它会向锁服务器发送另一个请求,说它已经完成并释放信号量。这可确保我们将对这些资源的访问限制为最大并发访问数。
问题:如果出现问题,想要优雅地处理。
问题:
如何在信号量上实现超时?
示例:
假设我的信号量大小为 5。同时有 10 个进程试图获取信号量中的锁,因此在这种情况下只有 5 个进程会获取它。
有时,进程会在没有响应的情况下死掉(真正的原因解释起来有点复杂,但基本上有时进程可能无法解锁它)因此导致信号量中的空间现在被永久锁定的问题。
所以我想对此有一个超时。以下是一些问题:
进程将在 2 秒到 60 分钟之间运行。
我们有一些竞争条件,因为如果它超时然后进程尝试解锁它,那么我们已经解锁了信号量两次而不是一次。反之亦然,我们先解锁,然后超时。
如何采用上面发布的建议模式并将其转换为具有超时的线程安全信号量?
【问题讨论】:
-
您的要求有多严格?如果超过 5 台服务器同时访问共享资源,您是否尝试限制对资源的访问,或者是否存在硬故障模式?
-
这里有多个 Go 计数信号量示例:github.com/tarndt/sema
-
嗨,这个问题的作者是如何解决这个用例的?还是解决了?
标签: multithreading concurrency thread-safety go semaphore