91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言結束協程的方法

發布時間:2020-06-11 09:14:05 來源:億速云 閱讀:1003 作者:鴿子 欄目:編程語言

goroutine和channel是Go語言非常棒的特色,它們提供了一種非常輕便易用的并發能力。但是當您的應用進程中有很多goroutine的時候,如何在主流程中等待所有的goroutine 退出呢?

1 通過Channel傳遞退出信號 

Go的一大設計哲學就是:通過Channel共享數據,而不是通過共享內存共享數據。主流程可以通過channel向任何goroutine發送停止信號,就像下面這樣:

func run(done chan int) {
        for {
                select {
                case <-done:
                        fmt.Println("exiting...")
                        done <- 1
                        break
                default:
                }
 
                time.Sleep(time.Second * 1)
                fmt.Println("do something")
        }
}
 
func main() {
        c := make(chan int)
 
        go run(c)
 
        fmt.Println("wait")
        time.Sleep(time.Second * 5)
 
        c <- 1
        <-c
 
        fmt.Println("main exited")
}

這種方式可以實現優雅地停止goroutine,但是當goroutine特別多的時候,這種方式不管在代碼美觀上還是管理上都顯得笨拙不堪。

2 使用waitgroup

sync包中的Waitgroup結構,是Go語言為我們提供的多個goroutine之間同步的好刀。下面是官方文檔對它的描述:

通常情況下,我們像下面這樣使用waitgroup:

創建一個Waitgroup的實例,假設此處我們叫它wg

在每個goroutine啟動的時候,調用wg.Add(1),這個操作可以在goroutine啟動之前調用,也可以在goroutine里面調用。當然,也可以在創建n個goroutine前調用wg.Add(n)

當每個goroutine完成任務后,調用wg.Done()

在等待所有goroutine的地方調用wg.Wait(),它在所有執行了wg.Add(1)的goroutine都調用完wg.Done()前阻塞,當所有goroutine都調用完wg.Done()之后它會返回。

以上就是golang 如何結束一個協程的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節
推薦閱讀:
  1. lua 協程
  2. GO協程

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

浠水县| 江山市| 昭苏县| 耿马| 大埔区| 西吉县| 新津县| 平邑县| 抚顺县| 龙里县| 图们市| 富蕴县| 湘潭县| 皋兰县| 成都市| 绥德县| 漠河县| 金华市| 扶沟县| 两当县| 福安市| 梧州市| 长顺县| 温泉县| 乌海市| 依兰县| 大同县| 宁波市| 武平县| 应城市| 垫江县| 双柏县| 乐至县| 舟山市| 黄平县| 龙海市| 阿勒泰市| 攀枝花市| 定陶县| 旬阳县| 甘孜|