信號燈在Golang與信道來實現:Golang:如何超時信號量?
一個例子是這樣的: https://sites.google.com/site/gopatterns/concurrency/semaphores
語境:
我們有幾百個服務器,並有共享,我們要限制資源進入。因此,對於給定的資源,我們希望使用信號量來限制對這些服務器只有5個併發訪問的訪問。爲了做到這一點,我們計劃使用鎖服務器。當一臺機器訪問資源時,它將首先向鎖服務器註冊它正在通過密鑰訪問資源。然後,當它完成時,它會向鎖服務器發送另一個請求,表示完成並釋放信號量。這確保我們將對這些資源的訪問限制爲最大數量的併發訪問。
問題:想要優雅地處理這個,如果出現錯誤。
問題:
你如何去對信號實現超時?
例子:
比方說,我有5旗語大小有同時存在10個進程試圖獲取信號量的鎖所以在這種情況下,只有5將收購它。
有時候,進程會死而沒有響應(真正的原因有點複雜的解釋,但基本上有時進程可能無法解鎖它),因此信號量中的空間現在永久鎖定,從而導致問題。
所以我想對這個超時。這裏有一些問題:
的過程將從秒2之間的任何地方運行長達60分鐘。
我們有一些競爭條件,因爲如果超時,然後進程試圖解開它,那麼我們已經揭開了信號,而不是一次兩次。反之亦然,我們先解鎖它,然後超時。
如何採取張貼以上,並把它變成與超時線程安全的旗語的建議圖案?
您的要求有多嚴格?您是否想要限制對資源的訪問,或者如果超過5臺服務器同時訪問共享資源,是否存在硬故障模式? –
有多種轉到這裏計數信號的例子:https://github.com/tarndt/sema – voidlogic