我們經常需要讓主 goroutine 處於永久阻塞狀態,這樣其他的 gorotine 就可以一直執行處理資訊。下面我總結了幾種可以實現永久阻塞的方法,其中大部分例項**無法直接執行,因為 go runtime 會檢查所有 goroutine 並提示所有的 goroutine 都處於 deadlock,在實際使用中,我們新增具體的業務 goroutien 就可以執行了。
說到永久阻塞第乙個想到的應該就是死迴圈。
package main
func main()
}
死迴圈雖然可以實現永久阻塞,但是對於 go 而言,for 死迴圈所在的 goroutine 還是一直處於「執行」狀態,所以死迴圈會消耗一定的 cpu,不推薦使用。
使用鎖,我們可以對已經鎖了的鎖,再次申請鎖。
package main
import (
"sync"
)func main()
該例項**會提示死鎖。不推薦使用。
乙個不會減少的 waitgroup 就實現了永久阻塞
package main
import "sync"
func main()
該例項**會提示死鎖。
空 select 會一直阻塞
package main
func main()
}
該例項**會提示死鎖。
使用 channel 本身會一直阻塞直到接收到資訊。
package main
func main() )
<-c
}
nil channel 會永久阻塞
package main
func main()
<-c
}
使用訊號量配合 channel 實現永久阻塞
package main
import (
"os"
"os/signal"
"syscall"
)func main()
這樣只有當我們傳遞 sigusr2 訊號(kill -usr2 [pid]
)的時候阻塞才會停止。sig 要設定為可緩衝的 channel,或者可能如果 goroutine 沒有準備好訊號會被丟棄。 go 通道的阻塞測試
go version go1.11.2 linux amd64 package main import fmt func main fmt.println naturals close close naturals go func fmt.println squares close close sq...
go 非阻塞通道
預設情況 channel 傳送和接收資料時阻塞的 然而我們可以使用select的default的選項來實現無阻塞傳送和接收資料 甚至可以將多個select的case選項和default選項結合起來使用 package main import fmt func main 如果case阻塞 則執行def...
幾個小技巧幫你實現Golang永久阻塞
目錄 go 的執行時的當前設計,假定程式設計師自己負責檢測何時終止乙個 goroutine 以及何時終止該程式。可以通過呼叫 osdwczjd.exit 或從 main 函式的返回來以正常方式終止程式。而有時候我們需要的是使程式阻塞在這一行。一直等待直到 waitgroup 等於 0 package...