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

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

我如何將工人返回到 Go 中的工人池

我如何將工人返回到 Go 中的工人池

Go
千巷貓影 2023-06-12 17:13:33
我正在實施一個可以從渠道獲取工作的工作人員池。一直超時后,我發現當一個worker fcn內部發生panic時,即使我做了恢復機制,worker還是不會再回到pool中。在 golang 操場上,我能夠重現這個問題:修改后的游樂場代碼:package mainimport "fmt"import "time"import "log"func recovery(id int, results chan<- int) {? ? if r := recover(); r != nil {? ? ? ? log.Print("IN RECOVERY FUNC - Failed worker: ",id)??? ? ? ? results <- 0? ? }}func worker(id int, jobs <-chan int, results chan<- int) {? ? for j := range jobs {? ? defer recovery(id, results)? ? if id == 1 {? ? ? ? panic("TEST")? ? }? ? ? ? fmt.Println("worker", id, "started job", j)? ? ? ? time.Sleep(time.Second)? ? ? ? fmt.Println("worker", id, "finished job", j)? ? ? ? results <- j * 2? ? }}func main() {? ? jobs := make(chan int, 100)? ? results := make(chan int, 100)? ? for w := 1; w <= 3; w++ {? ? ? ? go worker(w, jobs, results)? ? }? ? for j := 1; j <= 10; j++ {? ? ? ? jobs <- j? ? }? ? close(jobs)? ? for a := 1; a <= 10; a++ {? ? ? ? <-results? ? }}為了測試,我在使用 worker 1 時實施了恐慌。運行時,函數會按預期發生恐慌,并按預期進入恢復狀態(也不會將值推送到通道中),但是 worker 1 似乎永遠不會回來。沒有恐慌的輸出:worker 3 started job 1worker 1 started job 2worker 2 started job 3worker 1 finished job 2worker 1 started job 4worker 3 finished job 1worker 3 started job 5worker 2 finished job 3worker 2 started job 6worker 3 finished job 5worker 3 started job 7worker 1 finished job 4worker 1 started job 8worker 2 finished job 6worker 2 started job 9worker 1 finished job 8worker 1 started job 10worker 3 finished job 7worker 2 finished job 9worker 1 finished job 10恐慌輸出:worker 3 started job 12009/11/10 23:00:00 RECOVERY Failed worker: 1worker 2 started job 3worker 2 finished job 3worker 2 started job 4worker 3 finished job 1worker 3 started job 5worker 3 finished job 5worker 3 started job 6worker 2 finished job 4worker 2 started job 7worker 2 finished job 7worker 2 started job 8worker 3 finished job 6worker 3 started job 9worker 3 finished job 9worker 3 started job 10worker 2 finished job 8worker 3 finished job 10恢復后(或在恢復過程中)如何將工作人員 1 返回池中
查看完整描述

1 回答

?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

如果你關心這些錯誤,你可以將一個errors通道傳遞給輔助函數,如果他們遇到一個error,將它發送到通道然后continue。主循環可以處理這些錯誤。

或者,如果您不關心錯誤,只需continue跳過該作業即可。

continue語句基本上停止處理循環的迭代,并繼續下一個。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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