文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

go 通道出现问题,在封闭通道上发送

2024-02-11 19:17

关注

php小编柚子在使用Go语言开发过程中,可能会遇到一些问题,其中之一就是在封闭的通道上发送数据时出现了问题。这个问题可能会导致通道的阻塞和程序的停滞,影响整个应用的运行。在解决这个问题之前,我们首先需要了解什么是封闭通道,以及为什么在封闭通道上发送数据会出现问题。接下来,我们将深入探讨这个问题,并提供解决方案来修复和优化我们的Go应用程序。

问题内容

我收到一个致命错误:“在关闭的通道上发送”,有时我运行此代码,我尝试了多种解决方案,但没有一个有效,这是代码的表示,易于理解且易于使用测试:

CB14CE50B218D8EAB916B15CD95527D5

我想要的是启动请求函数n次并获取第一个完成的请求,然后关闭通道并且不要向通道发送更多请求,如果没有一个请求成功完成,则等待所有goroutines完成.

我想发生这种情况是因为两个或多个 goroutine 同时检查通道是否关闭,并且两个都尝试在通道中写入,这会导致致命错误。

错误:

goroutine 19 [running]:
main.request(0xc00000a028, 0xc00000a030, 0x0?)
        C:/test/main.go:49 +0x135
created by main.main
        C:/test/main.go:17 +0xd3
panic: send on closed channel

谁能解释一下为什么会发生这种情况?

提前致谢

解决方法

问题是接收 goroutine (main) 过早关闭 outputCh。其他一些 goroutine 仍然可以尝试在其上发送。

这是另一种方法:

package main

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

func main() {
    var wg sync.WaitGroup
    output := make(chan string)
    stop := make(chan bool)
    done := make(chan bool)

    for i := 0; i < 20; i++ {
        wg.Add(1)
        go request(output, stop, &wg)
    }

    go func() {
        wg.Wait()
        done <- true
    }()

    firstOutput := <-output
    fmt.Println("output:", firstOutput)

    fmt.Println("closing the stop channel")
    close(stop)

    <-done
    fmt.Println("end of main")
}

func request(output chan string, stop chan bool, wg *sync.WaitGroup) {
    defer wg.Done()

    fmt.Println("request started")
    time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond)

    select {
    case output <- "test":
        fmt.Println("output sent")
    case <-stop:
        fmt.Println("stop channel is closed")
    }
}

以上就是go 通道出现问题,在封闭通道上发送的详细内容,更多请关注编程网其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯