Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
go lang,为什么go例程函数从未被调用_Go - Fatal编程技术网

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将运行到完成。您通常不应该在代码中使用它。此问题与和重复