信号灯在Golang与信道来实现:Golang:如何超时信号量?
一个例子是这样的: https://sites.google.com/site/gopatterns/concurrency/semaphores
语境:
我们有几百个服务器,并有共享,我们要限制资源进入。因此,对于给定的资源,我们希望使用信号量来限制对这些服务器只有5个并发访问的访问。为了做到这一点,我们计划使用锁服务器。当一台机器访问资源时,它将首先向锁服务器注册它正在通过密钥访问资源。然后,当它完成时,它会向锁服务器发送另一个请求,表示完成并释放信号量。这确保我们将对这些资源的访问限制为最大数量的并发访问。
问题:想要优雅地处理这个,如果出现错误。
问题:
你如何去对信号实现超时?
例子:
比方说,我有5旗语大小有同时存在10个进程试图获取信号量的锁所以在这种情况下,只有5将收购它。
有时候,进程会死而没有响应(真正的原因有点复杂的解释,但基本上有时进程可能无法解锁它),因此信号量中的空间现在永久锁定,从而导致问题。
所以我想对这个超时。这里有一些问题:
的过程将从秒2之间的任何地方运行长达60分钟。
我们有一些竞争条件,因为如果超时,然后进程试图解开它,那么我们已经揭开了信号,而不是一次两次。反之亦然,我们先解锁它,然后超时。
如何采取张贴以上,并把它变成与超时线程安全的旗语的建议图案?
您的要求有多严格?您是否想要限制对资源的访问,或者如果超过5台服务器同时访问共享资源,是否存在硬故障模式? –
有多种转到这里计数信号的例子:https://github.com/tarndt/sema – voidlogic