iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题
  • 726
分享到

为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题

go语言 2024-02-10 21:02:59 726人浏览 安东尼
摘要

PHP小编柚子在解决编程问题时,可能会遇到一个常见的错误提示:“Goroutines are sleeped”。这个错误通常与生产者消费者问题有关。生产者消费者问题是并发编程中的一种经

PHP小编柚子在解决编程问题时,可能会遇到一个常见的错误提示:“Goroutines are sleeped”。这个错误通常与生产者消费者问题有关。生产者消费者问题是并发编程中的一种经典情景,其中一个或多个生产者生成数据,而一个或多个消费者从中取出数据进行处理。当生产者生成数据的速度超过消费者处理数据的速度时,就可能导致goroutines(Go语言中的轻量级线程)进入休眠状态。本文将解释为什么会出现这个错误,并提供解决方法。

问题内容

这是代码 - go 例程中的生产者和多个消费者。 生产者正在向一个通道注入信息,多个消费者(每个消费者通过一个 go-routine)应该并行读取它。

func main() {
    alphabetArray := []string{"A", "B", "C"}

    alphabetChannel := make(chan string, 3)
    // producer.
    go func() {
        for _, alphabet := range alphabetArray {
            alphabetChannel <- alphabet
        }
    }()

    var wg sync.WaitGroup
    // spawn 10 consumers, consumers represented as a go-routine.
    for idx := 0; idx < 10; idx++ {
        wg.Add(1)
        go func() {
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()
    }
    wg.Wait()
}

这是去游乐场的链接 - https://go.dev/play/p/yndataeexpb

我收到的错误是这样的 -

一个 乙 c 致命错误:所有 goroutine 都在睡觉 - 死

解决方法

生产者完成后关闭通道,以便消费者知道何时停止:

go func() {
        defer close(alphabetchannel)
        for _, alphabet := range alphabetarray {
            alphabetchannel <- alphabet
        }
    }()

让等待组知道消费者何时完成:

go func() {
            defer wg.Done()
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()

以上就是为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题的详细内容,更多请关注编程网其它相关文章!

--结束END--

本文标题: 为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题

本文链接: https://www.lsjlt.com/news/563241.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作