日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

幾個(gè)小技巧幫你實(shí)現(xiàn)Golang永久阻塞_Golang

作者:折疊椅 ? 更新時(shí)間: 2021-12-15 編程語言

Go 的運(yùn)行時(shí)的當(dāng)前設(shè)計(jì),假定程序員自己負(fù)責(zé)檢測何時(shí)終止一個(gè) goroutine 以及何時(shí)終止該程序??梢酝ㄟ^調(diào)用 os.Exit 或從 main() 函數(shù)的返回來以正常方式終止程序。而有時(shí)候我們需要的是使程序阻塞在這一行。

使用 sync.WaitGroup

一直等待直到 WaitGroup 等于 0

package main

import "sync"

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    wg.Wait()
}

空 select

select{}是一個(gè)沒有任何 case 的 select,它會(huì)一直阻塞

package main

func main() {
    select{}
}

死循環(huán)

雖然能阻塞,但會(huì) 100%占用一個(gè) cpu。不建議使用

package main

func main() {
    for {}
}

用 sync.Mutex

一個(gè)已經(jīng)鎖了的鎖,再鎖一次會(huì)一直阻塞,這個(gè)不建議使用

package main

import "sync"

func main() {
    var m sync.Mutex
    m.Lock()
}

os.Signal

系統(tǒng)信號(hào)量,在 go 里面也是個(gè) channel,在收到特定的消息之前一直阻塞

package main

import (
    "os"
    "syscall"
    "os/signal"
)

func main() {
    sig := make(chan os.Signal, 2)
    signal.Notify(sig, syscall.SIGTERM, syscall.SIGINT)
    <-sig
}

空 channel 或者 nil channel

channel 會(huì)一直阻塞直到收到消息,nil channel 永遠(yuǎn)阻塞。

package main

func main() {
    c := make(chan struct{})
    <-c
}
package main

func main() {
    var c chan struct{} //nil channel
    <-c
}

總結(jié)

注意上面寫的的代碼大部分不能直接運(yùn)行,都會(huì) panic,提示“all goroutines are asleep - deadlock!”,因?yàn)?go 的 runtime 會(huì)檢查你所有的 goroutine 都卡住了, 沒有一個(gè)要執(zhí)行。你可以在阻塞代碼前面加上一個(gè)或多個(gè)你自己業(yè)務(wù)邏輯的 goroutine,這樣就不會(huì) deadlock 了。

參考

https://pliutau.com/different-ways-to-block-go-runtime-forever/

原文鏈接:https://juejin.cn/post/6844903598216871943

欄目分類
最近更新