登录
首页 >  Golang >  Go问答

如何检查单个通道上的数据是否为空,若有多个发送方在通道上发送数据?

来源:stackoverflow

时间:2024-03-18 08:45:29 460浏览 收藏

**如何检查单个通道上的数据是否为空,若有多个发送方在通道上发送数据?** 在并发编程中,使用通道来传递数据,但有时需要检查通道是否为空,特别是当有多个发送方时。本文将探讨如何优雅地检查单个通道上的数据是否为空,并提供代码示例,帮助你解决这个问题。通过遵循本文中的步骤,你可以确保你的并发代码高效且无死锁,有效地处理数据流。

问题内容

我有一个简单的示例,但不知道如何修复它以使其按我的预期工作。

它应该打印 result: 30 但屏幕显示:致命错误:所有 goroutine 都在睡觉 - 死锁!

我认为这里的问题是语句 for val := range data。当数据通道为空时,仍然等待接收数据。但我不知道如何解决,请帮助我。

package main

import (
    "fmt"
)

func senderSide(data chan int) {
    num := 5
    for i := 1; i <= num; i++ {
        data <- i
    }
    // close(data) //panic: send on closed channel if uncomment it
}

func receiverSide(data chan int, resp chan int) {
    sum := 0
    for val := range data {
        sum += val
    }
    resp <- sum
}

func main() {
    data := make(chan int)
    resp := make(chan int)
    go senderSide(data)
    go senderSide(data)
    go receiverSide(data, resp)
    result := <-resp
    fmt.Printf("Result: %v\n", result) //result = 30
}

解决方案


我不太明白你的问题,但僵局很容易解释。您永远不会关闭 data chan,因此 recevierSide 中的循环永远不会关闭,因为它一直在等待更多数据。

这又意味着它永远不会发送响应,因此程序死锁。

本篇关于《如何检查单个通道上的数据是否为空,若有多个发送方在通道上发送数据?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

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