2 回答

TA貢獻1853條經驗 獲得超6個贊
這需要 6 秒,因為您正在從返回的通道接收worker()
,因此在worker()
從第一個接收到值之前,第二個無法啟動,這需要 3 秒。
您正在使用元組分配。規格:作業:
任務分兩個階段進行。首先,左側的索引表達式和指針間接(包括選擇器中的隱式指針間接)的操作數和右側的表達式都按通常的順序進行計算。其次,作業是按從左到右的順序進行的。
先啟動 2 個 worker,然后再從通道中接收,這樣 goroutine 才能真正并發運行:
ch1, ch2 := worker(), worker()_, _ = <-ch1, <-ch2
有了這個,輸出將是(在Go Playground上嘗試):
3

TA貢獻1805條經驗 獲得超9個贊
您也可以刪除通道,因為您沒有使用通道的結果,只需使用 sync.WaitGroup
func worker(n int, wg *sync.WaitGroup) {
defer wg.Done()
time.Sleep(3 * time.Second)
fmt.Println("done")
}
func main() {
timeStart := time.Now()
var wg sync.WaitGroup
for i := 0; i <= 1; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait()
fmt.Println(int(time.Since(timeStart).Seconds())) // 3
}
這是示例代碼: https: //play.golang.org/p/9_Ymx0tcHqS
- 2 回答
- 0 關注
- 139 瀏覽
添加回答
舉報