猿问

为什么我的 goroutine 没有启动?

不,这不是因为我的程序结束得太快了。


我有这个脚本:


package main


import ("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_fr

2016/03/04 20:35:14 Now lunching goroutine for file abc_hrty

2016/03/04 20:35:14 Finished launching.

脚本不会停止,也不会记录Now exiting,因为它会在空 for 中循环。但我没有看到In goroutine for file消息。


为什么会这样?我究竟做错了什么?


谢谢您的帮助!


素胚勾勒不出你
浏览 116回答 1
1回答

跃然一笑

如果您的程序正在运行GOMAXPROCS=1(即,单个操作系统线程),请for{}在不让 Go 的用户模式调度程序运行的情况下冻结它。这是关于它的问题。JimB 指出它会导致其他问题,无论GOMAXPROCS; 最终,运行时必须停止您的 goroutine 以进行垃圾收集,并且它无法停止for{}。更改for{}为select{}让调度程序运行并且不占用 CPU。在这个简化的程序中,你的 goroutine 代码运行。它以“所有 goroutines 都睡着了 - 死锁!”结束。因为你的另一个 goroutine 退出了,唯一剩下的一个(main)挂在select{}.package mainimport "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这样的东西。
随时随地看视频慕课网APP

相关分类

Go
我要回答