亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

暫停工作人員池

暫停工作人員池

Go
慕碼人2483693 2023-03-29 17:10:02
使用看起來比這更接近的工作池的 golang 實現我想暫停我的工作人員幾秒鐘,同時像交易過程一樣進行數據庫同步。我不希望我的同步數據被另一個潛在的不受控制的工作人員更新。暫停工作的最佳方式是什么?關閉所有工人?在工人中使用 chan 以防止在暫停時找到工作?在處理工作之前使用全局標志在每個工人中設置一個鎖?謝謝
查看完整描述

1 回答

?
慕雪6442864

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 以防止在暫停時找到工作?

    這實施起來會很復雜,因為您需要向所有工人發出停止工作的信號,并確保他們在開始工作之前確實已經停止主動處理工作。還需要反向:重新開始的信號。

涉及最少代碼的工作的最簡單工具是互斥鎖。我建議使用那個。


查看完整回答
反對 回復 2023-03-29
  • 1 回答
  • 0 關注
  • 106 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號