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 关注
- 115 浏览
添加回答
举报