亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的 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 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號