为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的 goroutine 没有启动?

为什么我的 goroutine 没有启动?

Go
素胚勾勒不出你 2021-12-20 15:06:44
不,这不是因为我的程序结束得太快了。我有这个脚本:package mainimport ("log"; "io/ioutil"; "strings")const BASE_FILE_NAME = "abc_"func mygoroutine(file_name string) {    log.Println("In goroutine for file", file_name)}func get_file_names() []string {  file_names := make([]string, 0)  files, _ := ioutil.ReadDir("./")  for _, file := range files {      if strings.HasPrefix(file.Name(), BASE_FILE_NAME) {        file_names = append(file_names, file.Name())      }  }  return file_names}func main()  {    file_names := get_file_names()    for _, file_name := range file_names {        log.Println("Now lunching goroutine for file", file_name)        go mygoroutine(file_name)    }    log.Println("Finished launching.")    for {}    log.Println("Now exiting")}在包含可执行文件的目录中,我有两个以开头的文件,abc_因此输出如下:2016/03/04 20:35:14 Now lunching goroutine for file abc_fr2016/03/04 20:35:14 Now lunching goroutine for file abc_hrty2016/03/04 20:35:14 Finished launching.脚本不会停止,也不会记录Now exiting,因为它会在空 for 中循环。但我没有看到In goroutine for file消息。为什么会这样?我究竟做错了什么?谢谢您的帮助!
查看完整描述

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这样的东西。


查看完整回答
反对 回复 2021-12-20
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信