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) 或者調換子協程和主協程的代碼順序,這是為什么呢?
uj5u.com熱心網友回復:
主協程如果在子協程之前結束,那么子協程是不會有輸出的。事實上,現在一般都是多核電腦,子協程還是有機會輸出的,但如果你指定了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()
}
uj5u.com熱心網友回復:
子協程還沒來得及執行,主行程就退出了uj5u.com熱心網友回復:
go test()for i :=0;i<10 ;i++{
runtime.Gosched() //讓主協程讓出時間片
fmt.Println("主協程hello")
}
把go test()提前,你放在后面是什么意思?寫在后面,runtime.Gosched() //讓主協程讓出時間片
這時候go test()根本沒執行到,你不是白讓時間片了?
最靠譜的還是上面說的,用waitgroup去同步。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/11731.html
標籤:go語言
