go语言小白求助,为什么我的子协程不会执行??

Master林 2020-03-05 11:45:00
package main

import (
"fmt"
"runtime"
)

func test(){

for i :=0;i <5;i++{
fmt.Println("子协程 hello")
}
}

func main() {

for i :=0;i<10 ;i++{
runtime.Gosched() //让主协程让出时间片
fmt.Println("主协程hello")
}
go test()
}
为什么我的子协程不会执行呢? 我已经加了runtime.Gosched() 。

后来又试了一下 ,除非再加 time.Sleep(time.Second) 或者调换子协程和主协程的代码顺序,这是为什么呢?
...全文
246 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lu-xl 2020-08-21
  • 打赏
  • 举报
回复
子协程还没来得及执行,主进程就退出了
ying1234 2020-08-21
  • 打赏
  • 举报
回复
go test() for i :=0;i<10 ;i++{ runtime.Gosched() //让主协程让出时间片 fmt.Println("主协程hello") } 把go test()提前,你放在后面是什么意思?写在后面,runtime.Gosched() //让主协程让出时间片 这时候go test()根本没执行到,你不是白让时间片了? 最靠谱的还是上面说的,用waitgroup去同步。
ustb 2020-03-05
  • 打赏
  • 举报
回复
主协程如果在子协程之前结束,那么子协程是不会有输出的。 事实上,现在一般都是多核电脑,子协程还是有机会输出的,但如果你指定了CPU的核数,子协程几乎没有机会输出,如下代码:

func main() {
    runtime.GOMAXPROCS(1) // 指定核数
    for i := 0; i < 3; i++ {
        runtime.Gosched() //让主协程让出时间片
        fmt.Println("主协程hello")
    }
    go test()
}
如果你把go test()这一行提到for之前,也是一样有问题的,只要把for循环的次数改小,你会发现子协程一样是有可能不执行的。 time.Sleep也是不靠谱的,如果子协程耗时很长,可能都不会有完整的输出。 要确保子协程执行,可以考虑用chanel或waitgroup


var wg = sync.WaitGroup{}

func test() {
    for i := 0; i < 5; i++ {
        fmt.Println("子协程 hello")
    }
    wg.Done()
}

func main() {
    runtime.GOMAXPROCS(1) // 指定核数
    for i := 0; i < 3; i++ {
        //runtime.Gosched() //让主协程让出时间片
        fmt.Println("主协程hello")
    }
    wg.Add(1)
    go test()
    wg.Wait()
}

2,190

社区成员

发帖
与我相关
我的任务
社区描述
go语言学习与交流版
社区管理员
  • go语言社区
  • Freeman Z
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧