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

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

處理 goroutine 時的奇怪事情

處理 goroutine 時的奇怪事情

Go
慕運維8079593 2021-06-29 13:15:08
有兩件奇怪的事情。我在切片中制作了 1000 個數字,但它只打印 246,為什么是 246?為什么不是 1000?如果我刪除"log.Println("hey")"這一行,為什么只打印0?我知道它可能有同步問題,但我之前沒有寫過任何并發(fā)程序,所以有什么文章可以推薦嗎?import (      "log"      "runtime")func main() {  count := 1000  slice := make([] int,count)  for i := 0; i <= count-1; i++ {   slice[i] =i  }  for _,v := range slice{    go echo(v)  }  log.Println("hey")//if delete this line,it just print 0  runtime.Gosched()}func echo(v int) {  log.Println(v)}
查看完整描述

2 回答

?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

不能保證任何 go 例程在您的主例程完成之前運行。當主例程完成時,您的程序將退出,而無需等待您創(chuàng)建的所有 go 例程完成(甚至啟動)。

解決此問題的最簡單方法是分配一個同步通道,將其傳遞給每個 echo 實例,并在您的日志語句之后向其寫入一個令牌。然后主線程應該count在返回之前從該通道讀取令牌。


查看完整回答
反對 回復 2021-07-12
?
萬千封印

TA貢獻1891條經驗 獲得超3個贊

如果你退出你的主要 go 例程,它不會等待任何已經運行的 go 例程。您需要同步正在運行的 go 例程,根據我的經驗,sync.WaitGroup是正確的通用解決方案。

import (

    "log"

    "sync"

)


func main() {


    count := 1000

    slice := make([]int, count)

    for i := 0; i <= count-1; i++ {

        slice[i] = i

    }

    wg := new(sync.WaitGroup)

    for _, v := range slice {

        wg.Add(1)

        go echo(v, wg)

    }

    wg.Wait()

}


func echo(v int, wg *sync.WaitGroup) {

    defer wg.Done()

    log.Println(v)

}


查看完整回答
反對 回復 2021-07-12
  • 2 回答
  • 0 關注
  • 239 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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