第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

需要一點(diǎn)幫助來理解代碼流程?我不明白輸出中的routine-end 是如何出現(xiàn)在其他輸出語句之間的

需要一點(diǎn)幫助來理解代碼流程?我不明白輸出中的routine-end 是如何出現(xiàn)在其他輸出語句之間的

Go
UYOU 2022-05-23 17:13:12
試圖理解 goroutine 的流程,所以我寫了這段代碼,只有一件我無法理解的事情是,routine-end 如何在其他 go 例程之間運(yùn)行并完成單個 go 例程并在最后打印來自通道的輸出.import(    "fmt")func add(dataArr []int,dataChannel chan int,i int ){    var sum int    fmt.Println("GOROUTINE",i+1)    for i:=0;i<len(dataArr);i++{        sum += dataArr[i]    }    fmt.Println("wRITING TO CHANNEL.....")    dataChannel <- sum    fmt.Println("routine-end")}func main(){    fmt.Println("main() started")    dataChannel := make(chan int)    dataArr := []int{1,2,3,4,5,6,7,8,9}    for i:=0;i<len(dataArr);i+=3{        go add(dataArr[i:i+3],dataChannel,i)    }       fmt.Println("came to blocking statement ..........")    fmt.Println(<-dataChannel)    fmt.Println("main() end")}outputmain() startedcame to blocking statement ..........GOROUTINE 1wRITING TO CHANNEL.....routine-endGOROUTINE 4wRITING TO CHANNEL.....6main() end
查看完整描述

1 回答

?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個贊

您的循環(huán)啟動了 3 個調(diào)用該函數(shù)for的 goroutine 。add

此外,main它本身在一個單獨(dú)的“主”goroutine 中運(yùn)行。

由于 goroutines 并發(fā)執(zhí)行,它們的運(yùn)行順序通常是不可預(yù)測的,并且取決于時間、機(jī)器的繁忙程度等。運(yùn)行之間和機(jī)器之間的結(jié)果可能會有所不同。在不同的地方插入time.Sleep呼叫可能有助于將其可視化。例如,time.Sleep在“來到阻塞語句”之前插入 100ms 表明所有addgoroutines 啟動。

您在運(yùn)行中通常會看到一個addgoroutine 啟動,將其切片添加到其上并sum寫入. 由于啟動了一些 goroutine 并立即從通道中讀取,因此該讀取獲取了寫入的內(nèi)容,然后程序就存在了——因?yàn)?strong>默認(rèn)情況下 main 不會等待所有 goroutine 完成。sumdataChannelmainsumadd

此外,由于dataChannel通道是無緩沖的并且main只讀取一個值,因此其他addgoroutine 將在寫入時無限期地阻塞在通道上。


查看完整回答
反對 回復(fù) 2022-05-23
  • 1 回答
  • 0 關(guān)注
  • 139 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號