为什么我的goroutine没有执行?

Sup*_*hon 12 go

我正在学习Go,我想尝试goroutines和频道.

这是我的代码:

package main
import "fmt"
func main(){

messages := make(chan string,3)

messages <- "one"
messages <- "two"
messages <- "three"

go func(m *chan string) {
    fmt.Println("Entering the goroutine...")
    for {
        fmt.Println(<- *m)
    }
}(&messages)

fmt.Println("Done!")
}
Run Code Online (Sandbox Code Playgroud)

这是结果:

Done!
Run Code Online (Sandbox Code Playgroud)

我不明白为什么我的goroutine永远不会被执行.没有打印"输入goroutine",我没有任何错误消息.

Elw*_*nar 22

事实是你的goroutine开始了,但是在做任何事情之前就结束了因为你的程序在打印后立即停止Done!:goroutines的执行与主程序无关,但是会在程序之后停止.所以基本上,你需要一些程序让程序等待它们.它可能是另一个等待许多消息,a sync.WaitGroup或其他技巧的频道.

你应该在Golang博客中阅读关于并发性的优秀帖子.


Int*_*net 6

您的Goroutine没有足够的时间执行,因为主要功能在打印后退出Done!.

你需要做一些事情让程序等待Goroutine.

最简单的方法是添加time.Sleep()到最后.

package main

import (
    "fmt"
    "time"
)

func main() {

    messages := make(chan string, 3)

    messages <- "one"
    messages <- "two"
    messages <- "three"

    go func(m *chan string) {
        fmt.Println("Entering the goroutine...")
        for {
            fmt.Println(<-*m)
        }
    }(&messages)
    time.Sleep(5 * time.Second)
    fmt.Println("Done!")
}
Run Code Online (Sandbox Code Playgroud)

进入够程...
一个
2
3
完成!

操场

虽然这有效,但sync除了goroutines之外,还建议使用包中的通道或函数来同步并发代码.

例:

package main

import (
    "fmt"
)

func main() {

    messages := make(chan string, 3)
    go func(m chan string) {
        defer close(m)
        fmt.Println("Entering the goroutine...")
        messages <- "one"
        messages <- "two"
        messages <- "three"
    }(messages)
    for message := range messages {
        fmt.Println("received", message)
    }
    fmt.Println("Done!")
}
Run Code Online (Sandbox Code Playgroud)

进入goroutine ...
收到一个
收到两个
收到三个
完成!

操场

  • 睡觉工作,但是最糟糕的解决方案.它在实际情况下是无用的. (2认同)