Go-channel的妙用

news/2024/11/28 5:34:15/

系列文章目录

异常处理(defer recover panic)
Go-channel的妙用


文章目录

  • 系列文章目录
  • 前言
  • 一、channel 通过通讯共享内存
  • 二、使用场景
  • 三、例子
    • 1.包
  • 总结


前言

Go语言中,各个协程之间的通信,Go 语言协程之间通信的理念通过通信去共享内存。就是采用channel 技术实现。


一、channel 通过通讯共享内存

  1. channel的方向, 读、写、读写;
  2. channel 协程间通信信道;
  3. channel 阻塞协程;
  4. channel 并发场景下的同步机制;
  5. channel 通知协程退出;
  6. channel 的多路复用; 借助于select监听,channel阻塞在select ,

二、使用场景

  1. 协程间通信,即协程间数据传输;
  2. 并发场景下利用channel的阻塞机制,作为同步机制(类似队列);例如并发打印日志,可以把并发写日志请求写入channel,然后使用另个一协程在读取channel 中请求,写日志。
  3. 利用channel关闭时发送广播的特性,作为协程退出通知;channel 关闭的时候,会向所有监听它的协程发送一个零值。

三、例子

1.包

代码如下(示例):case/channel.go

package _caseimport ("fmt""time"
)// 协程间通信
func Communication() {// 定义一个可读可写的通道ch := make(chan int, 0)go communicationF1(ch)go communicationF2(ch)
}// F1接受一个只写通道
func communicationF1(ch chan<- int) {// 通过循环向通道写入0~99for i := 0; i < 99; i++ {ch <- i}
}// F1接受一个只读通道
func communicationF2(ch <-chan int) {// 通过循环向通道写入0~99for i := range ch {fmt.Println(i)}
}// 并发场景下的同步机制
func ConcurentSync() {//带缓冲的通道 chan 带10个缓存,可以并发写入10个,写满后阻塞,只有读出后才能狗写入ch := make(chan int, 10)// 向chan 写入数据go func() {for i := 0; i < 100; i++ {ch <- i}}()// 向chan 写入数据go func() {for i := 0; i < 100; i++ {ch <- i}}()// 从chan 中读取数据go func() {for i := range ch {fmt.Println(i)}}()
}// 通知协程退出,多路复用
func NoticeAndMultiplexing() {ch := make(chan int, 0)strCh := make(chan string, 0)done := make(chan struct{}, 0)go noticeAndMultiplexingF1(ch)go noticeAndMultiplexingF2(strCh)go noticeAndMultiplexingF3(ch, strCh, done)time.Sleep(5 * time.Second)close(done) // 关闭done 时候会向所有监听它的协程发送一个零值。
}func noticeAndMultiplexingF1(ch chan<- int) {for i := 0; i < 100; i++ {ch <- i}
}func noticeAndMultiplexingF2(ch chan<- string) {for i := 0; i < 100; i++ {ch <- fmt.Sprintf("数字:%d", i)}}// select 子句作为一个整体阻塞,其中任意channel 准备就绪则继续执行
func noticeAndMultiplexingF3(ch <-chan int, strCh <-chan string, done <-chan struct{}) {i := 0for {select {case i := <-ch:fmt.Println(i)case str := <-strCh:fmt.Println(str)case <-done:fmt.Println("收到退出通知,退出当前协程")return}i++fmt.Println("累计执行次数: ", i)}}代码如下(示例):main.c```c
package mainimport (_case "channel-select/case""os""os/signal"
)func main() {//_case.Communication()//_case.ConcurentSync()_case.NoticeAndMultiplexing()ch := make(chan os.Signal, 0)signal.Notify(ch, os.Interrupt, os.Kill) //ctr+c 或kill 时候往channel 中写入信号量<-ch                                     // 从 ch 中读取数据,数据内容不关心,只要有信号意味着系统退出了,没有值读出就是阻塞到这里
}

总结

注意: channel 用于协程间通讯,必须存在读写双方,否则将造成死锁


http://www.ppmy.cn/news/109815.html

相关文章

C语言system()函数

文章目录 C语言system()函数system(“pause”)system(“color num1num2”)system(“cls”)system(“title name”)system(“time /T”) & system(“date /T”) C语言system()函数 头文件&#xff1a; #include<stdlib.h>system(“pause”) 作用&#xff1a;暂停程序进…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

【C#图解教程】第四章 类型、存储和变量 学习笔记总结

类型 C#是一组类型声明&#xff0c;这个与第三章&#xff1a;命名空间就是一组类型声明可以一起理解。类型是一个用来创建数据结构的模板&#xff1a; 使用这个模板创建对象的过程叫做实例化&#xff0c;所以创建的对象也叫实例 类型成员 简单类型可能只包含一个数据成员&…

深度剖析 Vue.js 经典知识点之:SPA、SSR与MVVM

SPA 更多精彩内容&#xff0c;请微信搜索“前端爱好者“&#xff0c; 戳我 查看 。‘ 谈一谈你对 SPA 单⻚面的理解&#xff0c;它的优缺点分别是什么 SPA&#xff08; single-page application &#xff09;仅在 Web ⻚面初始化时加载相应的 HTML、JavaScript 和 CSS。 一旦…

mongdb常用查询

mongdb数据库和关系型数据库完全不同&#xff0c; 主要在数据结构存储和查询语法方面。mongdb是把数据存在文档里面&#xff0c;文档里面是一种bson格式的数据(类似json格式)&#xff0c;再通过mongdb的javascript语法取读取符合条件的文档内容用表的形式展示给我们。查询语句为…

数电/数字电子技术期末考前突击复习(小白稳过,看这一篇就够了)

博主&#xff1a;命运之光 专栏&#xff1a;期末考试必过and不挂科and争高分&#x1f636;‍&#x1f32b;️还有其他科目的考试突击日后会陆续更新 ✨✨✨✨✨点赞&#xff0c;关注&#xff0c;收藏不迷路✨✨✨✨✨ &#x1f984;前言&#xff1a;总结了期末数电大概率可能…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发&#xff0c;开发工具采用Microsoft Visual Studio 2010集成开发环境&#xff0c;后台编程语言采用C#编程语言来进行编程开发&#xff0c;数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息&#xff0c;整个…

微服务-Elasticsearch基础篇【内含思维导图】

Elasticsearch官网&#xff1a;欢迎来到 Elastic — Elasticsearch 和 Kibana 的开发者 | Elastic 注意&#xff1a;Elasticsearch官网访问和加载的耗时很长&#xff01;&#xff01;&#xff01; Lucene官网&#xff1a;Apache Lucene - Welcome to Apache Lucene 目录 一、E…