go lang,为什么go例程函数从未被调用
您不能在退出go lang,为什么go例程函数从未被调用,go,Go,您不能在退出main()之前运行goroutine 即使对say的第二次调用(短暂地)阻塞,也不能保证第一个goroutine可以运行。您需要等待两者都返回,这通常由WaitGroup完成 package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { //runtime.Gosched() fmt.Println(s)
main()
之前运行goroutine
即使对say
的第二次调用(短暂地)阻塞,也不能保证第一个goroutine可以运行。您需要等待两者都返回,这通常由WaitGroup完成
package main
import (
"fmt"
"runtime"
)
func say(s string) {
for i := 0; i < 5; i++ {
//runtime.Gosched()
fmt.Println(s)
}
}
func main() {
go say("world") // create a new goroutine
runtime.Gosched()
say("hello") // current goroutine
}
var wg sync.WaitGroup
func say(s字符串){
推迟工作组完成()
对于i:=0;i<5;i++{
//runtime.Gosched()
fmt.Println(s)
}
}
func main(){
工作组.添加(1)
去说(“世界”)//创建一个新的goroutine
工作组.添加(1)
说(“你好”)//当前goroutine
wg.Wait()
}
你只是遇到了一个时间问题,因为你没有“协调”你的围棋程序。处理此问题的常用方法是使用等待保护。我不时看到的另一个选项是使用通道和阻塞选择。一个wait-guard实现看起来像这样
var wg sync.WaitGroup
func say(s string) {
defer wg.Done()
for i := 0; i < 5; i++ {
//runtime.Gosched()
fmt.Println(s)
}
}
func main() {
wg.Add(1)
go say("world") // create a new goroutine
wg.Add(1)
say("hello") // current goroutine
wg.Wait()
}
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go say("world") // create a new goroutine
wg.Add(1)
say("hello") // current goroutine
wg.Wait()
}
而频道选项(在本例中实际上并不有趣或有用)更像这样
var wg sync.WaitGroup
func say(s string) {
defer wg.Done()
for i := 0; i < 5; i++ {
//runtime.Gosched()
fmt.Println(s)
}
}
func main() {
wg.Add(1)
go say("world") // create a new goroutine
wg.Add(1)
say("hello") // current goroutine
wg.Wait()
}
func main() {
wg := sync.WaitGroup{}
wg.Add(1)
go say("world") // create a new goroutine
wg.Add(1)
say("hello") // current goroutine
wg.Wait()
}
func main(){
完成:=制作(陈波)
去说(“世界”,完成)//创建一个新的goroutine
说(“你好”,完成)//当前goroutine
挑选{
case fin:=这是因为主goroutine过早退出。当主goroutine退出时,进程将退出,因此其他goroutine没有机会运行。如果希望goroutine运行,请让主例程保持足够长的时间
func main() {
done := make(chan bool)
go say("world", done) // create a new goroutine
say("hello", done) // current goroutine
select {
case fin := <- done:
//on finished
return
}
}
func say(s string, chan bool) {
for i := 0; i < 5; i++ {
fmt.Println(s)
}
done <- true
}
主程序包
进口(
“fmt”
“运行时”
)
func say(s字符串){
对于i:=0;i<5;i++{
fmt.Println(s)
}
}
func main(){
去说(“世界”)//创建一个新的goroutine
runtime.Gosched()
说(“你好”)//当前goroutine
time.Sleep(1*time.Second)//此行
}
使用GoSched
并不保证其他goroutine将运行到完成。您通常不应该在代码中使用它。此问题与和重复