Go的進(jìn)程阻塞

在Go語(yǔ)言中,如果使用goroutine,經(jīng)常需要阻塞主進(jìn)程來等待goroutine的結(jié)束,我們有以下幾種方式來實(shí)現(xiàn)


使用channel實(shí)現(xiàn)

package main

import (
    "log"
    "time"
)

func main() {
    ch := make(chan int, 1)

    go func() {
        log.Println("wait 3s...")
        time.Sleep(3 * time.Second)
        ch<-1
    }()

    <-ch
}

使用waitGroup實(shí)現(xiàn)

waiteGroup顧名思義,是等待一組行為執(zhí)行結(jié)束,利用wg.Add()來添加group,利用wg.Donewg.Add(-1)來移除,wg.Wait()一直阻塞直到group完全釋放

package main

import (
    "log"
    "sync"
    "time"
)

func main() {
    var wg sync.WaitGroup

    for i:=0;i<5;i++{
        wg.Add(1)
        go func(n int) {
            defer wg.Done()
            time.Sleep(3 * time.Second)
            log.Println(n)
        }(i)
    }

    wg.Wait()
}

NSQ源碼中使用示例

此處代碼是NSQ中封裝的WaitGroupWrapper,通過Wrap方法可以方便的添加需要執(zhí)行的goroutine,并阻塞主進(jìn)程

package util

import (
    "sync"
)

type WaitGroupWrapper struct {
    sync.WaitGroup
}

func (w *WaitGroupWrapper) Wrap(cb func()) {
    w.Add(1)
    go func() {
        cb()
        w.Done()
    }()
}

阻塞os信號(hào)

如果進(jìn)程被kill,很多時(shí)候我們不能立即退出,需要善后,處理類似內(nèi)存信息持久化等信息。
那么在Go中如何優(yōu)雅的退出進(jìn)程,下面這段代碼通過捕捉os信號(hào)后,進(jìn)行退出前的異常處理

    signalChan := make(chan os.Signal, 1)
    // 捕捉 Ctrl+c 和 kill 信號(hào),寫入signalChan
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)
    // 此處執(zhí)行處理邏輯
    nsqd.Main()

    // signalChan阻塞進(jìn)程
    <-signalChan

    // 捕捉信號(hào)后在Exit函數(shù)中處理信息,例如內(nèi)存持久化等信息防止丟失
    nsqd.Exit()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,332評(píng)論 0 23
  • Goroutine是Go里的一種輕量級(jí)線程——協(xié)程。相對(duì)線程,協(xié)程的優(yōu)勢(shì)就在于它非常輕量級(jí),進(jìn)行上下文切換的代價(jià)非...
    witchiman閱讀 5,158評(píng)論 0 9
  • 控制并發(fā)有三種種經(jīng)典的方式,一種是通過channel通知實(shí)現(xiàn)并發(fā)控制 一種是WaitGroup,另外一種就是Con...
    wiseAaron閱讀 10,839評(píng)論 4 34
  • Iterable MXNET中讀入數(shù)據(jù)需要使用到數(shù)據(jù)迭代器(Iter),用戶可以使用MXNET提供的一些數(shù)據(jù)迭代器...
    學(xué)而時(shí)習(xí)之_不亦說乎閱讀 780評(píng)論 0 0
  • 給抽煙的前輩 領(lǐng)導(dǎo) 女生 給喝茶的前輩 領(lǐng)導(dǎo) 朋友
    陳穩(wěn)閱讀 134評(píng)論 0 0

友情鏈接更多精彩內(nèi)容