登录
首页 >  Golang >  Go问答

Go lang 多路复用所有 goroutine 都处于休眠状态 - 死锁

来源:Golang技术栈

时间:2023-03-24 10:28:50 463浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《Go lang 多路复用所有 goroutine 都处于休眠状态 - 死锁》带大家来了解一下Go lang 多路复用所有 goroutine 都处于休眠状态 - 死锁,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

我想使用多个返回通道的 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 

但是运行上面的代码后出现错误

所有 goroutine 都处于休眠状态 - 死锁

我试图关闭频道,但它仍然给我错误。我试图将无聊的返回频道分配给乔和安,然后将这些频道传递给多路复用的通话功能,但仍然没有成功。我是新来的,学习渠道对这个概念不太清楚。

正确答案

而不是等待组,您可以使用selecthttps ://tour.golang.org/concurrency/5

select语句让 goroutine 等待多个通信操作。

Aselect阻塞,直到它的一个案例可以运行,然后它执行那个案例。如果多个都准备好了,它会随机选择一个。

package main

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

func main() {
    final := talk(boring("Joe"), boring("Ann"))
    for i := 0; i 

在操场上试试

编辑:

在您给定的示例中,boring函数不使用 goroutine 通过通道重复发送,这将永远阻塞,因为: https ://tour.golang.org/concurrency/2

默认情况下,发送和接收阻塞,直到对方准备好。这允许 goroutines 在没有显式锁或条件变量的情况下进行同步。

此外,wg.Done()需要成为 goroutine 的一部分。

我通过进行上述更改使其工作:https: //play.golang.org/p/YN0kfBO6iT

文中关于golang的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Go lang 多路复用所有 goroutine 都处于休眠状态 - 死锁》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>