在下面的代碼中有兩個(gè)包含工作的通道 A 和 B,在實(shí)際代碼中它們是不同的結(jié)構(gòu),工作人員需要在退出之前排空兩個(gè)通道。工作人員需要來(lái)自兩個(gè)渠道的信息。這兩個(gè) select 語(yǔ)句可以工作,但非常笨拙。如果我添加default:以使它們非阻塞,則代碼無(wú)法排出通道。有沒(méi)有更好的方式來(lái)編寫(xiě)選擇?現(xiàn)在,如果通道 A 沒(méi)有工作,則通道 B 也不會(huì)得到服務(wù)。另一個(gè)需要解決的問(wèn)題,但不是我主要關(guān)心的問(wèn)題。用于測(cè)試以下代碼的游樂(lè)場(chǎng):package mainimport ( "fmt" "time")const ( fillCount = 10 // number of elements in each input channel numWorkers = 3 // number of consumers.)func Wait() { time.Sleep(2000 * time.Millisecond)}func fillChannel(work chan string, name string) { for i := 0; i < fillCount; i++ { work <- fmt.Sprintf("%s%d", name, i) } close(work) // we're finished}func doWork(id int, ch1 chan string, ch2 chan string, done chan bool) { fmt.Println("Running worker", id) defer fmt.Println("Ending worker", id) for ch1Open, ch2Open := true, true; ch1Open && ch2Open; { cnt1 := len(ch1) cnt2 := len(ch2) if ch1Open { select { case str, more := <-ch1: if more { fmt.Printf("%d: ch1(%d) %s\n", id, cnt1, str) } else { fmt.Printf("%d: ch1 closed\n", id) ch1Open = false } } } if ch2Open { select { case str, more := <-ch2: if more { fmt.Printf("%d: ch2(%d) %s\n", id, cnt2, str) } else { fmt.Printf("%d: ch2 closed\n", id) ch2Open = false } } } } done <- true}func main() { a := make(chan string, 2) // a small channel b := make(chan string, 5) // a bigger channel // generate work go fillChannel(a, "A") go fillChannel(b, "B") // launch the consumers done := make(chan bool) for i := 0; i < numWorkers; i++ { go doWork(i, a, b, done) } // wait for the goroutines to finish. for i := 0; i < numWorkers; i++ { <-done }
- 1 回答
- 0 關(guān)注
- 193 瀏覽
添加回答
舉報(bào)
0/150
提交
取消