iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang - 如何合并多个通道?
  • 754
分享到

Golang - 如何合并多个通道?

2024-04-04 23:04:08 754人浏览 薄情痞子
摘要

怎么入门golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面编程网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Golang - 如何合并多个通道

怎么入门golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面编程网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Golang - 如何合并多个通道?》,涉及到,有需要的可以收藏一下

问题内容

尝试安排项目,将项目发送到“状态”通道以获取状态,然后将项目发送到“删除”通道以删除项目。我正在设置两个通道的大小,预计在项目删除完成后我会“完成”。看起来代码在执行“删除”之后就停止了,然后才“完成”。为什么我会收到“致命错误:所有 goroutine 都在睡觉 - 死!”就在“删除项目”之后和“完成”之前吗?哪个 goroutine 正在睡觉?

https://go.dev/play/p/w49nif5xngq

package main
import (
    "fmt"
    "time"
)

func main() {
    numbers := []int{1, 2, 4}
    for _, n := range numbers {
        fmt.Printf("Schedule and delete %d items.\n", n)
        statusChan := make(chan string, n)
        deleteChan := make(chan string, n)
        done := make(chan bool)

        go func(n int, statusChan chan<- string) {
            for i := 0; i < n; i++ {
                i := i

                go func(n int, statusChan chan<- string) {
                    fmt.Printf("Scheduling item number ... %d\n", i)
                    itemNum := fmt.Sprintf("item_num_%d\n", i)
                    time.Sleep(500 * time.Millisecond)
                    statusChan <- itemNum
                }(n, statusChan)
            }
        }(n, statusChan)

        go func(statusChan <-chan string, deleteChan chan<- string) {
            for itemNum := range statusChan {
                fmt.Printf("Checking status of item number ... %s\n", itemNum)
                time.Sleep(500 * time.Millisecond)
                deleteChan <- itemNum
            }
        }(statusChan, deleteChan)

        go func(deleteChan <-chan string, done chan<- bool) {
            for itemNum := range deleteChan {
                fmt.Printf("Delete item: %s", itemNum)
                time.Sleep(500 * time.Millisecond)
            }
            fmt.Printf("Done with scheduling and deleting %d item.\n", n)
            done <- true
        }(deleteChan, done)
        <-done
    }
}


正确答案


这似乎符合您的想法。我使用“***”作为“全部完成”信号。

package main
import (
    "fmt"
    "time"
)

func main() {
    numbers := []int{1, 2, 4}
    for _, n := range numbers {
        fmt.Printf("Schedule and delete %d items.\n", n)
        statusChan := make(chan string, n)
        deleteChan := make(chan string, n)
        done := make(chan bool)

        go func(n int, statusChan chan<- string) {
            for i := 0; i < n; i++ {
                fmt.Printf("Scheduling item number ... %d\n", i)
                itemNum := fmt.Sprintf("item_num_%d\n", i)
                time.Sleep(500 * time.Millisecond)
                statusChan <- itemNum
            }
            statusChan <- "***"
        }(n, statusChan)

        go func(statusChan <-chan string, deleteChan chan<- string) {
            for itemNum := range statusChan {
              fmt.Printf("Checking status of item number ... %s\n", itemNum)
              deleteChan <- itemNum
            }
        }(statusChan, deleteChan)

        go func(deleteChan <-chan string, done chan<- bool) {
            for itemNum := range deleteChan {
              if itemNum == "***" {
                break
              }
              fmt.Printf("Delete item: %s", itemNum)
            }
            fmt.Printf("Done with scheduling and deleting %d item.\n", n)
            done <- true
        }(deleteChan, done)
        <-done
    }
}

以上就是《Golang - 如何合并多个通道?》的详细内容,更多关于的资料请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: Golang - 如何合并多个通道?

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

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

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

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

下载Word文档
猜你喜欢
  • Golang - 如何合并多个通道?
    怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面编程网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《Golang - 如何合并多个通道...
    99+
    2024-04-04
  • js如何合并多个对象
    这篇文章将为大家详细讲解有关js如何合并多个对象,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。合并多个对象实际需求中,我们经常需要合并多个对照,快速的做法可以像下面这么做:const user&...
    99+
    2023-06-27
  • Android基于opencv实现多通道分离与合并
    目录多通道分离API操作通道合并API操作结果源码多通道分离 API public static void split(Mat m, List<Mat> mv) ...
    99+
    2024-04-02
  • vbs如何合并多个excel文件
    这篇文章将为大家详细讲解有关vbs如何合并多个excel文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。代码如下:Const xlWorkbookNormal = -4143 Const xlSaveC...
    99+
    2023-06-08
  • 如何用union合并多个select
    要使用UNION合并多个SELECT语句,可以按照以下步骤进行操作:1. 确保每个SELECT语句返回的列数和数据类...
    99+
    2023-08-11
    union select
  • PHP如何合并一个或多个数组
    这篇文章将为大家详细讲解有关PHP如何合并一个或多个数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 合并数组 PHP 提供了多种方法来合并一个或多个数组: array_merge() 函数 ar...
    99+
    2024-04-02
  • golang如何将通道关闭
    本篇内容主要讲解“golang如何将通道关闭”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“golang如何将通道关闭”吧!在golang中,可以使用close()函数来关闭通道,语法“close...
    99+
    2023-07-05
  • JavaScript如何同时合并多个对象
    这篇文章主要为大家展示了“JavaScript如何同时合并多个对象”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript如何同时合并多个对象”这篇文...
    99+
    2024-04-02
  • python如何按列合并多个文件
    使用python按列合并多个文件的方法:1.新建python项目;2.导入pandas模块;3.使用pd.read方法分别打开文件;4.使用pd.merge()方法按列合并文件;具体步骤如下:首先,打开python,并新建一个python项...
    99+
    2024-04-02
  • Go中如何使用select遍历多个通道
    在Go中,可以使用select语句来遍历多个通道。select语句可以同时监听多个通道的操作,并在其中任意一个通道准备就绪...
    99+
    2024-04-02
  • wps如何把多个文档合并成一个
    这篇文章主要介绍了wps如何把多个文档合并成一个的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇wps如何把多个文档合并成一个文章都会有所收获,下面我们一起来看看吧。首先打开空白文档,然后点击上面的“插入”。 然...
    99+
    2023-07-02
  • 如何用python合并多个excel文件
    目录安装模块 XlsxWriter 示例 合并Excel数据 表头都一样的 excel 表头都不一样的 excel 表头都不一样的 excel 安装模块 1、找到对应的模块 &nb...
    99+
    2024-04-02
  • Java 多个List合并
    Java 多个List合并 多个同类型集合合并,可以使用可变参数,定义一个专门的方法,参考代码如下: public class Main { public static void main(String[] args) { ...
    99+
    2023-08-17
    java list 开发语言
  • python如何用nbmerge合并多个notebook文件
    这篇文章主要讲解了“python如何用nbmerge合并多个notebook文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“python如何用nbmerge合并多个notebook文件”吧...
    99+
    2023-06-19
  • golang 如何正确地关闭通道
    Golang是近年来开发人员中越来越流行的编程语言。它提供了许多方便的特性,其中一个就是通道(Channel)。通道是Golang中用于协程(Goroutine)之间通信的一种机制。通道的优点是可以保证数据交换的原子性,并且可以在多个协程之...
    99+
    2023-05-14
  • golang redis中Pipeline通道如何使用
    本文小编为大家详细介绍“golang redis中Pipeline通道如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“golang redis中Pipeline通道如何使用”文章能帮助大家解决疑惑,下面跟着小编的...
    99+
    2023-06-30
  • Win7系统如何合并磁盘分区将两个或多个合并到一起
      在重装雨林木风Win7系统之前,进行了磁盘分区,装完系统后才发现有一个磁盘只分到了17.4GB,于是就想到了合并磁盘分区。下面教大家雨林木风Win7系统下合并磁盘分区的方法,并将实战成果作一个演示。   1.选中桌面...
    99+
    2023-06-08
    Win7 合并 磁盘分区 系统
  • PHP如何递归地合并一个或多个数组
    这篇文章将为大家详细讲解有关PHP如何递归地合并一个或多个数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 中使用递归合并数组 递归是解决问题的常用技术,涉及到将一个问题分解为更小的子问题,这些子...
    99+
    2024-04-02
  • Golang 并发以及通道的使用方式
    Golang最擅长的就是并发编程,使用Golang可以很方便的进行并发编程。先看一段普通的代码 package main import ( "fmt" "time" ) ...
    99+
    2024-04-02
  • Java如何实现合并多个升序链表
    本篇内容介绍了“Java如何实现合并多个升序链表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!需求描述给出K个升序链接,要求把这K个升序链表...
    99+
    2023-07-06
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作