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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

等待 go 例程完成的正確方法

等待 go 例程完成的正確方法

Go
胡子哥哥 2021-08-16 19:26:57
我想知道在退出程序之前等待 goroutine 完成的正確方法是什么。閱讀其他一些答案似乎 bool chan 可以解決問題,如Playground 鏈接func do_stuff(done chan bool) {    fmt.Println("Doing stuff")    done <- true}func main() {    fmt.Println("Main")    done := make(chan bool)    go do_stuff(done)    <-done    //<-done}我在這里有兩個(gè)問題:為什么 <- done 完全有效?如果我取消對(duì)最后一行的注釋會(huì)發(fā)生什么?我有一個(gè)死鎖錯(cuò)誤。這是因?yàn)橥ǖ朗强盏牟⑶覜]有其他函數(shù)向它發(fā)送值嗎?
查看完整描述

2 回答

?
BIG陽

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊

為什么是<- done作品?

  • 它起作用是因?yàn)檫\(yùn)行時(shí)檢測(cè)到您正在向其他地方的通道寫入內(nèi)容。

如果我取消對(duì)最后一行的注釋會(huì)發(fā)生什么?

  • 運(yùn)行時(shí)足夠聰明,知道沒有其他東西被寫入并且它會(huì)死鎖。

獎(jiǎng)勵(lì),如果您的內(nèi)存非常有限,您可以使用done := make(chan struct{})and done <- struct{}{},struct{}保證使用 0 內(nèi)存。


查看完整回答
反對(duì) 回復(fù) 2021-08-16
?
飲歌長嘯

TA貢獻(xiàn)1951條經(jīng)驗(yàn) 獲得超3個(gè)贊

收聽 channel<- done是一個(gè)阻塞操作,所以你的程序不會(huì)繼續(xù),直到發(fā)送 true 或 false ,即done <- true。


根據(jù)情況,您的問題可以有幾個(gè)不同的答案。


例如,假設(shè)您想要并行化一系列需要很長時(shí)間的函數(shù)調(diào)用。


我會(huì)為此使用該sync軟件包


package main


import (

    "fmt"

    "sync"

    "time"

)


func main() {

    var wg sync.WaitGroup

    for i := 0; i < 10; i++ {

        wg.Add(1)

        go func() {

            longOp()

            wg.Done()

        }()

    }

    // will wait until wg.Done is called 10 times

    // since we made wg.Add(1) call 10 times

    wg.Wait()

}


func longOp() {

    time.Sleep(time.Second * 2)

    fmt.Println("long op done")

}


查看完整回答
反對(duì) 回復(fù) 2021-08-16
  • 2 回答
  • 0 關(guān)注
  • 257 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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