Go lang:所有Goroutine都处于休眠状态-死锁

Go lang:所有Goroutine都处于休眠状态-死锁,go,Go,我想使用多个go例程创建一个扇入函数,返回通道这里是我的代码 package main import ( "fmt" "math/rand" "sync" "time" ) var wg, wg2 sync.WaitGroup func main() { final := talk(boring("Joe"), boring("Ann")) for i := 0; i < 10; i++ { fmt.Println(&l

我想使用多个go例程创建一个扇入函数,返回通道这里是我的代码

package main

import (
    "fmt"
    "math/rand"
    "sync"
    "time"
)

var wg, wg2 sync.WaitGroup

func main() {
    final := talk(boring("Joe"), boring("Ann"))
    for i := 0; i < 10; i++ {
        fmt.Println(<-final)
    }
    fmt.Println("You are both boring I'm leaving")
}

func talk(input1, input2 <-chan string) <-chan string {
    out := make(chan string)
    go func() {
        wg.Add(1)
        for {
            out <- <-input1
        }
    }()
    go func() {
        wg.Add(1)
        for {
            out <- <-input2
        }
    }()
    wg.Done()
    close(out)
    return out
}

func boring(msg string) <-chan string {
    c := make(chan string)
    for i := 0; i < 5; i++ {
        c <- fmt.Sprintf("%s%d\n", msg, i)
        time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
    }
    return c
}
主程序包
进口(
“fmt”
“数学/兰德”
“同步”
“时间”
)
变量wg,wg2 sync.WaitGroup
func main(){
期末:=谈话(无聊(“乔”)、无聊(“安”))
对于i:=0;i<10;i++{

fmt.Println(您无法自行停止goroutine,我建议您通过以下方式向goroutine发出退出的信号:

stop := make(chan bool)
go func() {
    for {
        select {
        case <- stop:
            return
        default:
            // Do other stuff
        }
    }
}()

// Do stuff

// Quit goroutine
stop<- true
stop:=make(chan bool)
go func(){
为了{
挑选{

案例您可以使用
select
,而不是等待组:

select
语句允许goroutine等待多个通信 行动

select
阻塞,直到其中一个案例可以运行,然后执行该操作 案例。如果多个已准备就绪,则随机选择一个

主程序包
进口(
“fmt”
“数学/兰德”
“时间”
)
func main(){
期末:=谈话(无聊(“乔”)、无聊(“安”))
对于i:=0;i<10;i++{

fmt.Println(我已经试过了。但它不起作用。我不知道哪个go例程会产生死锁,为什么?在go中,非缓冲通道会一直阻塞,直到通道的另一端发生了什么事情,无论您是发送还是接收。因此,对于您的情况,使您的通道缓冲,这应该会有所帮助。您是对的,我可以选择Se选择而不是等待不知道哪一个在管道中的例程。但我想知道它造成死锁的确切原因。我主要关心的是我的代码不工作的原因。是的,我也这样做了。因为我再次检查了我的代码,发现我没有使用go例程在side无聊函数中将值发送到通道。谢谢更新
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    final := talk(boring("Joe"), boring("Ann"))
    for i := 0; i < 10; i++ {
        fmt.Println(<-final)
    }
    fmt.Println("You are both boring I'm leaving")
}

func talk(input1, input2 <-chan string) <-chan string {
    c := make(chan string)
    go func() {
        for {
            select {
            case s := <-input1:
                c <- s
            case s := <-input2:
                c <- s
            }
        }
    }()
    return c
}

func boring(msg string) <-chan string {
    c := make(chan string)
    go func() {
        for i := 0; i < 5; i++ {
            c <- fmt.Sprintf("%s: %d", msg, i)
            time.Sleep(time.Duration(rand.Intn(1e3)) * time.Millisecond)
        }
    }()
    return c
}