iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Go语言通道之缓冲通道实例分析
  • 606
分享到

Go语言通道之缓冲通道实例分析

2023-07-02 18:07:35 606人浏览 安东尼
摘要

这篇“Go语言通道之缓冲通道实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言通道之缓冲通道实例分析”文章吧。有

这篇“Go语言通道之缓冲通道实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言通道之缓冲通道实例分析”文章吧。

有缓冲的通道相比于无缓冲通道,多了一个缓存的功能,如下图描述的一样:

Go语言通道之缓冲通道实例分析

从图上可以明显看到和无缓冲通道的区别,无缓冲必须两个Goroutine都进入通道才能进行数据的交换,这个不用,如果数据有,直接就能拿走。

package ChannelDemoimport (    "fmt"    "math/rand"    "sync"    "time")const (    numberGoroutines = 4    taskLoad         = 10)var bufferWg sync.WaitGroupfunc init() {    rand.Seed(time.Now().Unix())}func main() {    //创建了一个10任务的缓冲通道    tasks := make(chan string, taskLoad)    bufferWg.Add(numberGoroutines)    //创建4个Goroutine    for gr := 1; gr <= numberGoroutines; gr++ {        go worker(tasks, gr)    }    //向缓冲通道中放入数据    for post := 1; post <= taskLoad; post++ {        tasks <- fmt.Sprintf("Task : %d", post)    }    close(tasks)    bufferWg.Wait()}func worker(tasks chan string, worker int) {    defer bufferWg.Done()    for {        task, ok := <-tasks        if !ok {            fmt.Printf("Worker: %d : 结束工作 \n", worker)            return        }        fmt.Printf("Worker: %d : 开始工作 %s\n", worker, task)        //随机处理一下工作的时间        sleep := rand.Int63n(100)        time.Sleep(time.Duration(sleep) * time.Millisecond)        fmt.Printf("Worker: %d : 完成工作 %s\n", worker, task)    }}

运行结果:

Worker: 3 : 开始工作 Task : 4
Worker: 2 : 开始工作 Task : 2
Worker: 1 : 开始工作 Task : 1
Worker: 4 : 开始工作 Task : 3
Worker: 4 : 完成工作 Task : 3
Worker: 4 : 开始工作 Task : 5
Worker: 2 : 完成工作 Task : 2
Worker: 2 : 开始工作 Task : 6
Worker: 3 : 完成工作 Task : 4
Worker: 3 : 开始工作 Task : 7
Worker: 1 : 完成工作 Task : 1
Worker: 1 : 开始工作 Task : 8
Worker: 3 : 完成工作 Task : 7
Worker: 3 : 开始工作 Task : 9
Worker: 1 : 完成工作 Task : 8
Worker: 1 : 开始工作 Task : 10
Worker: 4 : 完成工作 Task : 5
Worker: 4 : 结束工作
Worker: 3 : 完成工作 Task : 9
Worker: 3 : 结束工作
Worker: 2 : 完成工作 Task : 6
Worker: 2 : 结束工作
Worker: 1 : 完成工作 Task : 10
Worker: 1 : 结束工作 

因为哪一个worker先从通道中取值有系统自己进行调度的,所以每次运行的结果稍微不同,但是相同的是10个任务被4个协程有条不紊的完成了

注意:main中有一句代码 Close(tasks) 关闭通道的代码非常重要。当通道关闭后,goroutine 依旧可以从通道接收数据,但是不能再向通道里发送数据。

能够从已经关闭的通道接收数据这一点非常重要,因为这允许通道关闭后依旧能取出其中缓冲的全部值,而不会有数据丢失.

以上就是关于“Go语言通道之缓冲通道实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Go语言通道之缓冲通道实例分析

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

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

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

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

下载Word文档
猜你喜欢
  • Go语言通道之缓冲通道实例分析
    这篇“Go语言通道之缓冲通道实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言通道之缓冲通道实例分析”文章吧。有...
    99+
    2023-07-02
  • Go语言通道之无缓冲通道实例分析
    这篇文章主要讲解了“Go语言通道之无缓冲通道实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Go语言通道之无缓冲通道实例分析”吧!一、通道是什么?其实无论是原子函数还是共享锁都是通过共...
    99+
    2023-07-02
  • Go语言通道之缓冲通道
    前文为大家讲解了Go语言通道之无缓冲通道 有缓冲的通道相比于无缓冲通道,多了一个缓存的功能,如下图描述的一样: 从图上可以明显看到和无缓冲通道的区别,无缓冲必须两个Goroutin...
    99+
    2022-11-13
  • Go语言通道之无缓冲通道
    一、通道是什么? 其实无论是原子函数还是共享锁都是通过共享内存的方式进行的同步、效率一般不高,而Go语言中则使用了通道,它是一种通过传递信息的方式进行数据同步,通过发送和接收需要共享...
    99+
    2022-11-13
  • Go语言带缓冲的通道实现
    Go语言中有缓冲的通道(buffered channel)是一种在被接收前能存储一个或者多个值的通道。这种类型的通道并不强制要求 goroutine 之间必须同时完成发送和接收...
    99+
    2022-06-07
    GO 缓冲 go语言
  • Go语言如何实现带缓冲的通道
    这篇文章主要介绍Go语言如何实现带缓冲的通道,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!什么是gogo是golang的简称,golang 是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程...
    99+
    2023-06-14
  • Go语言中通道channel的示例分析
    这篇文章将为大家详细讲解有关Go语言中通道channel的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Go语言通道基础概念1.channel产生背景    线程...
    99+
    2023-06-29
  • Go语言单向通道的实现
    目录单向通道的声明格式单向通道的使用例子 time包中的单向通道关闭 channelGo语言的类型系统提供了单方向的 channel 类型,顾名思义,单向 channel ...
    99+
    2023-05-14
    Go语言单向通道 Go单行道
  • Go语言单向通道如何实现
    今天小编给大家分享一下Go语言单向通道如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Go语言的类型系统提供了单方向的...
    99+
    2023-07-05
  • Go语言入门学习之Channel通道详解
    目录前言通道的声明通道的初始化发送和接收数据通道的关闭通道的容量与长度缓冲通道与无缓冲通道双向通道和单向通道遍历通道fibonacci 数列参考文章:总结前言 不同于传统的多线程并发...
    99+
    2022-11-13
  • Go语言学习教程之goroutine和通道的示例详解
    目录goroutine通道Range 和 CloseSelect官方留的两道练习题等价的二叉树网络爬虫源码地址goroutine goroutine是由Go运行时管理的轻量级线程。 ...
    99+
    2022-11-11
  • linux中C语言开发管道通信的示例分析
    这篇文章主要介绍了linux中C语言开发管道通信的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。linux C语言开发管道通信   Linux系统...
    99+
    2023-06-09
  • GO语言中通道和sync包的使用教程分享
    目录GO通道和 sync 包的分享通道是什么通道能做什么通道有哪几种无缓冲通道有缓冲的通道单向通道如何创建和声明一个通道声明通道初始化通道如何操作 channel通道异常情况梳理每一...
    99+
    2023-02-24
    GO 通道使用 GO sync包使用 GO 通道 GO sync包
  • Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据 在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如...
    99+
    2022-11-11
  • linux C语言开发管道通信实例详解
    linux C语言开发管道通信 Linux系统本身为进程间通信提供了很多的方式,比如说管道、共享内存、socket通信等。管道的使用十分简单,在创建了匿名管道之后,我们只需要从一个管道发送数据,再从另...
    99+
    2022-06-04
    详解 管道 实例
  • 深入理解Go语言文档中的io.Pipe函数实现管道通信
    深入理解Go语言文档中的io.Pipe函数实现管道通信,需要具体代码示例引言:在Go语言中,通过io.Pipe函数可以方便地实现管道通信。本文将深入探讨io.Pipe函数的使用方法,并通过具体的代码示例来展示其功能和使用场景。一、io.Pi...
    99+
    2023-11-04
    管道通信 关键词:Go语言 ioPipe
  • GO语言并发编程:如何利用通道(channel)实现数据同步和异步处理?
    Go语言是一门并发编程语言,它提供了一些强大的工具来支持并发编程。其中最重要的工具之一就是通道(channel)。通道是一种用于在不同goroutine之间传递数据的数据结构,它可以实现数据同步和异步处理。本文将介绍如何使用通道实现数据同...
    99+
    2023-11-04
    开发技术 编程算法 并发
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作