1 回答

TA貢獻1826條經驗 獲得超6個贊
如果您的程序正在運行GOMAXPROCS=1(即,單個操作系統線程),請for{}在不讓 Go 的用戶模式調度程序運行的情況下凍結它。這是關于它的問題。JimB 指出它會導致其他問題,無論GOMAXPROCS; 最終,運行時必須停止您的 goroutine 以進行垃圾收集,并且它無法停止for{}。
更改for{}為select{}讓調度程序運行并且不占用 CPU。在這個簡化的程序中,你的 goroutine 代碼運行。它以“所有 goroutines 都睡著了 - 死鎖!”結束。因為你的另一個 goroutine 退出了,唯一剩下的一個(main)掛在select{}.
package main
import "log"
const BASE_FILE_NAME = "abc_"
func mygoroutine(file_name string) {
log.Println("In goroutine for file", file_name)
}
func main() {
go mygoroutine("foo")
log.Println("Finished launching.")
select {}
log.Println("Now exiting")
}
當然,即使使用select{};通常你也不想掛起一個 goroutine 。這將留下一些資源在使用中,直到您的程序結束。要構建一些有用的東西,你需要像 async.WaitGroup或 channel這樣的東西。
- 1 回答
- 0 關注
- 137 瀏覽
添加回答
舉報