1 回答

TA貢獻1812條經驗 獲得超5個贊
如果要實現數據庫同步或至少向二進制文件發出信號,您可能會RWMutex為此目的濫用 。
Read在 worker 進行普通工作時 使用互斥鎖的一側,并要求Write在執行數據庫同步操作時保持該側。
至關重要的是,您必須確保Read僅在工作實際進行時舉行。如果 worker 因等待更多工作而被阻塞,則不得持有讀鎖,因為這會使掛起的 writer 餓死。
如果您使用它,我強烈建議您在代碼中添加有關互斥體預期行為的文檔,因為這在讀寫操作方面有些不標準。
如果您想要一個更通用的解決方案,您還可以包裝它并從派生接口導出不同的方法,并使用更好的名稱,如示例所示:
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()
}
任何解決方案都必須解決這些一般問題:
要求所有工人停止工作。
確保在允許數據庫工作開始之前所有工作人員都已停止。
向工人發出可以安全繼續工作的信號。
這樣做的替代方法包括以下方法,但在我看來,以下所有方法都比使用互斥鎖復雜得多(因此容易出現錯誤):
關閉所有工人?
要求工作人員在數據庫工作繼續進行之前停止工作將實現所需的互斥。您需要一種向它們發出停止信號的方法,以及一種檢測何時真正完成的機制。
在任何情況下都可能會爭辯說您無論如何都需要它來確保您在程序終止時干凈地關閉。但是,程序終止是致命的,因此您不需要能夠按照此數據庫同步工作所需的方式干凈地啟動和停止池。
在工人中使用 chan 以防止在暫停時找到工作?
這實施起來會很復雜,因為您需要向所有工人發出停止工作的信號,并確保他們在開始工作之前確實已經停止主動處理工作。還需要反向:重新開始的信號。
涉及最少代碼的工作的最簡單工具是互斥鎖。我建議使用那個。
- 1 回答
- 0 關注
- 106 瀏覽
添加回答
舉報