1 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果要實(shí)現(xiàn)數(shù)據(jù)庫(kù)同步或至少向二進(jìn)制文件發(fā)出信號(hào),您可能會(huì)RWMutex為此目的濫用 。
Read在 worker 進(jìn)行普通工作時(shí) 使用互斥鎖的一側(cè),并要求Write在執(zhí)行數(shù)據(jù)庫(kù)同步操作時(shí)保持該側(cè)。
至關(guān)重要的是,您必須確保Read僅在工作實(shí)際進(jìn)行時(shí)舉行。如果 worker 因等待更多工作而被阻塞,則不得持有讀鎖,因?yàn)檫@會(huì)使掛起的 writer 餓死。
如果您使用它,我強(qiáng)烈建議您在代碼中添加有關(guān)互斥體預(yù)期行為的文檔,因?yàn)檫@在讀寫(xiě)操作方面有些不標(biāo)準(zhǔn)。
如果您想要一個(gè)更通用的解決方案,您還可以包裝它并從派生接口導(dǎo)出不同的方法,并使用更好的名稱,如示例所示:
type WorkerGroupLocker struct {
sync.RWMutex
}
func (lock *WorkerGroupLocker) LockWorker() {
lock.RLock()
}
func (lock *WorkerGroupLocker) UnlockWorker() {
lock.RUnlock()
}
func (lock *WorkerGroupLocker) LockBackgroundSync() {
lock.Lock()
}
func (lock *WorkerGroupLocker) UnlockBackgroundSync() {
lock.Unlock()
}
任何解決方案都必須解決這些一般問(wèn)題:
要求所有工人停止工作。
確保在允許數(shù)據(jù)庫(kù)工作開(kāi)始之前所有工作人員都已停止。
向工人發(fā)出可以安全繼續(xù)工作的信號(hào)。
這樣做的替代方法包括以下方法,但在我看來(lái),以下所有方法都比使用互斥鎖復(fù)雜得多(因此容易出現(xiàn)錯(cuò)誤):
關(guān)閉所有工人?
要求工作人員在數(shù)據(jù)庫(kù)工作繼續(xù)進(jìn)行之前停止工作將實(shí)現(xiàn)所需的互斥。您需要一種向它們發(fā)出停止信號(hào)的方法,以及一種檢測(cè)何時(shí)真正完成的機(jī)制。
在任何情況下都可能會(huì)爭(zhēng)辯說(shuō)您無(wú)論如何都需要它來(lái)確保您在程序終止時(shí)干凈地關(guān)閉。但是,程序終止是致命的,因此您不需要能夠按照此數(shù)據(jù)庫(kù)同步工作所需的方式干凈地啟動(dòng)和停止池。
在工人中使用 chan 以防止在暫停時(shí)找到工作?
這實(shí)施起來(lái)會(huì)很復(fù)雜,因?yàn)槟枰蛩泄と税l(fā)出停止工作的信號(hào),并確保他們?cè)陂_(kāi)始工作之前確實(shí)已經(jīng)停止主動(dòng)處理工作。還需要反向:重新開(kāi)始的信號(hào)。
涉及最少代碼的工作的最簡(jiǎn)單工具是互斥鎖。我建議使用那個(gè)。
- 1 回答
- 0 關(guān)注
- 111 瀏覽
添加回答
舉報(bào)