iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >如何处理关闭同一通道的多个 go 例程?
  • 778
分享到

如何处理关闭同一通道的多个 go 例程?

2024-04-05 00:04:35 778人浏览 安东尼
摘要

最近发现不少小伙伴都对golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何处理关闭同一通道的多个 go 例程?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存

最近发现不少小伙伴都对golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何处理关闭同一通道的多个 go 例程?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我有 2 个 go 例程从单个通道读取数据。 4 秒后,我取消上下文并终止选择循环。在终止循环之前,我在通道上调用 close ,因为有 2 个 go 例程,所以 close 被调用两次并导致恐慌,因为其中一个 go 例程已经关闭了通道。目前我正在使用恢复来从恐慌中恢复,有更好的方法吗?

package main

import (
    "context"
    "fmt"
    "sync"
    "time"
)

func numberGen(ctx context.Context, numChan chan int) {
    num := 0
    doneCh := ctx.Done()
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("recovered from ", r)
        }
    }()
    for {
        select {
        case <-doneCh:
            fmt.Println("done generating...")
            close(numChan)
            return
        default:
            num++
            numChan <- num
        }
    }
}

func main() {
    ctx, cancelFn := context.WithCancel(context.Background())
    numChan := make(chan int)
    var wg sync.WaitGroup
    wg.Add(2)
    go numberGen(ctx, numChan)
    go numberGen(ctx, numChan)

    go func(cfn context.CancelFunc) {
        time.Sleep(10 * time.Millisecond)
        cfn()
    }(cancelFn)

    for n := range numChan {
        fmt.Println("received value ", n)
    }

    time.Sleep(2 * time.Second)
}


解决方案


goroutine 发送完值后关闭通道。

var wg sync.waitgroup
wg.add(2)
go numbergen(ctx, numchan, &wg)
go numbergen(ctx, numchan, &wg)

go func() {
    wg.wait()
    close(numchan)
}()

更新 numbergen 以在等待组上调用 done()。另外,删除对 close 的调用。

func numberGen(ctx context.Context, numChan chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    ...

今天关于《如何处理关闭同一通道的多个 go 例程?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 如何处理关闭同一通道的多个 go 例程?

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

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

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

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

下载Word文档
猜你喜欢
  • 如何处理关闭同一通道的多个 go 例程?
    最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《如何处理关闭同一通道的多个 go 例程?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存...
    99+
    2024-04-05
  • 如何实现关闭IDE通道检测的批处理
    这篇文章主要为大家展示了“如何实现关闭IDE通道检测的批处理”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现关闭IDE通道检测的批处理”这篇文章吧。示例:: 修改IDE通道检测设...
    99+
    2023-06-09
  • 如何一次关闭Vista多个IE8进程
    这期内容当中小编将会给大家带来有关如何一次关闭Vista多个IE8进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。自从微软向Vista用户推送IE 8后,新的问题也来了,在使用IE 8时会发现,任务管理...
    99+
    2023-06-14
  • 当所有工作完成后,如何关闭由多个 goroutine 填充的通道?
    当所有工作完成后,如何关闭由多个goroutine填充的通道是一个经常被提及的问题。在Go语言中,关闭一个通道是一种通知接收方没有更多数据的方式。通过关闭通道,接收方可以及时得知发送方...
    99+
    2024-02-10
    go语言
  • GO语言并发编程:如何利用通道(channel)实现数据同步和异步处理?
    Go语言是一门并发编程语言,它提供了一些强大的工具来支持并发编程。其中最重要的工具之一就是通道(channel)。通道是一种用于在不同goroutine之间传递数据的数据结构,它可以实现数据同步和异步处理。本文将介绍如何使用通道实现数据同...
    99+
    2023-11-04
    开发技术 编程算法 并发
  • 一个Servlet是如何处理多个请求的?
    1、servlet层 package com.ycz.controller; import com.alibaba.fastjson.JSON; import com.ycz....
    99+
    2024-04-02
  • Go 语言中的并发编程技巧:如何同时处理多个数组和缓存?
    Go 语言是一门支持并发编程的高级编程语言,对于处理高并发场景有着非常出色的表现。在并发编程中,同时处理多个数组和缓存是一个常见的需求。那么,在 Go 语言中,我们可以采用哪些技巧来实现这个需求呢?本文将为您介绍一些实用的并发编程技巧。 一...
    99+
    2023-07-08
    缓存 数组 并发
  • 如何实现一键关闭危险端口的批处理
    这篇文章给大家分享的是有关如何实现一键关闭危险端口的批处理的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一键关闭危险端口(防止黑客入侵) 危险, 端口, 黑客 讲以下内容全部复制 用记事本保存后缀为 bat 按提...
    99+
    2023-06-08
  • 如何通过C++编写一个简单的图片处理程序?
    在本文中,我们将了解如何通过C ++编写一个简单的图像处理程序。我们将涵盖从读取图像到应用过滤器和保存图像的所有基础知识。在开始编写图像处理程序之前,您需要安装OpenCV库。 OpenCV是一个流行的计算机视觉库,具有丰富的功能,可帮助您...
    99+
    2023-11-03
    C++ 图片处理 简单
  • 如何使用 Go 语言在 Linux 系统上同时处理多个二维码?
    Go 语言是一种强大的编程语言,可以用于开发高效、并发和可扩展的应用程序。在 Linux 系统上,Go 语言的并发特性可以被很好地利用,特别是当我们需要同时处理多个任务时。 本文将介绍如何使用 Go 语言在 Linux 系统上同时处理多个二...
    99+
    2023-09-21
    linux 二维码 并发
  • 如何打开同一公众号下关联的另一个小程序
    本文小编为大家详细介绍“如何打开同一公众号下关联的另一个小程序”,内容详细,步骤清晰,细节处理妥当,希望这篇“如何打开同一公众号下关联的另一个小程序”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。wx.naviga...
    99+
    2023-06-26
  • PHP 中如何同时处理多个文件的读写任务?
    在实际开发中,我们经常需要处理多个文件的读写任务,例如上传多个文件或同时读取多个文件进行处理等。那么,在 PHP 中,我们该如何同时处理多个文件的读写任务呢?本文将为您详细介绍 PHP 中处理多个文件读写任务的方法。 一、使用多线程 使用...
    99+
    2023-09-15
    并发 文件 shell
  • 如何在 Go 语言中使用函数关键字来处理多个文件?
    在 Go 语言中,我们经常需要处理多个文件,比如读取多个文件的内容进行合并,或者对多个文件进行处理。这时候,函数关键字就可以派上用场了。本文将介绍如何在 Go 语言中使用函数关键字来处理多个文件。 一、处理多个文件的基本方法 在 Go 语...
    99+
    2023-10-23
    函数 关键字 文件
  • PHP字符串处理:如何保留多个逗号中的唯一一个?
    PHP是一种广泛用于Web开发的脚本语言,字符串处理是其常见应用之一。在实际开发中,经常会遇到需要处理多个逗号的情况,并且需要保留这些逗号中的唯一一个。本文将介绍如何在PHP中实现这一...
    99+
    2024-04-02
  • ASP 中如何处理多个客户端同时请求的重定向?
    在ASP应用程序中,有时候需要将用户请求重定向到另一个页面或者网站。这个过程通常是通过向客户端发送一个HTTP重定向响应来实现的。然而,在多个客户端同时请求时,可能会出现一些问题,比如多个客户端同时请求同一个页面,但是只有一个客户端能够成...
    99+
    2023-07-03
    同步 重定向 并发
  • 如何处理Go语言中的并发进程间通信问题?
    如何处理Go语言中的并发进程间通信问题?Go语言作为一门支持并发的编程语言,提供了强大的并发处理能力。在多个并发进程同时执行的情况下,进程间的通信就显得尤为重要。本文将介绍在Go语言中如何处理并发进程间的通信问题,并提供具体的代码示例。Go...
    99+
    2023-10-22
    进程间通信 (Inter-process Communication) 并发进程通信 (Concurrent Proce
  • 如何通过PHP8的Match表达式更简洁地处理多个条件?
    如何通过PHP8的Match表达式更简洁地处理多个条件?PHP8引入了一种新的表达式——Match表达式,它在处理多个条件时相比之前的if-elseif-else语句更加简洁和直观。Match表达式使用了一种新的语法结构,可以更方便地进行值...
    99+
    2023-10-22
    PHP Match表达式 条件 简洁地处理
  • 如何利用Go和Django创建一个强大的自然语言处理应用程序?
    自然语言处理(NLP)是一种计算机科学领域的技术,它致力于让计算机能够理解、分析、生成人类语言。在当今信息时代,NLP技术的应用场景越来越广泛,例如智能客服、机器翻译、情感分析等。本文将介绍如何利用Go和Django创建一个强大的自然语言处...
    99+
    2023-08-26
    django 自然语言处理 索引
  • java如何实现单线程启动多个线程处理一个列表并在所有子线程处理完毕后父线程再处理其他操作
    这篇文章将为大家详细讲解有关java如何实现单线程启动多个线程处理一个列表并在所有子线程处理完毕后父线程再处理其他操作,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。主类:ParentChildMain父线...
    99+
    2023-06-03
  • 并发编程,你是如何处理多线程间的同步和互斥问题的?
    随着计算机技术的不断发展,多核处理器的出现使得多线程编程变得越来越普遍。然而,多线程编程带来的同步和互斥问题也随之而来。在本文中,我们将探讨如何在并发编程中处理多线程间的同步和互斥问题。 同步问题 在多线程编程中,同步问题是指多个线程在...
    99+
    2023-07-23
    bash leetcode 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作