我正在實施一個可以從渠道獲取工作的工作人員池。一直超時后,我發現當一個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 回答
- 0 關注
- 139 瀏覽
添加回答
舉報
0/150
提交
取消