Go lang:所有Goroutine都处于休眠状态-死锁
我想使用多个go例程创建一个扇入函数,返回通道这里是我的代码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
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
}