Go学习之路:并发(DAY 3)

news/2024/11/21 1:36:51/

文章目录

    • 前引
    • 并发
      • 1、Go协程/简单创建
      • 2.1、信道/简单创建信道
      • 2.2、信道/限制了大小的信道
      • 2.3、信道/range close信道
      • 3.1、Select语句


前引


听了会歌 一看了下今天已经下午2:50了
我们学校也好像开始放学生们回家了

那今天最后就愉快愉快的把我们的 A Tour Of Go 最后一程给送走吧
并发


并发


1、Go协程/简单创建


goroutine 大名鼎鼎的Go协程 原语言支持的协程
简单测试一下吧 这里也就是简单介绍


package mainimport "fmt"func TestGoroutine(str *string) {fmt.Println(*str)
}func main() {str := "hello"teststr := "say hello"go TestGoroutine(&str)TestGoroutine(&teststr)
}

运行效果
在这里插入图片描述


2.1、信道/简单创建信道


可以把其作为linux中的共享信道 作为pipe用
其实我个人认为就是pipe 而pipe在linux作为共享进程的通讯工具

这个就作为go中独有的channel 下面是简单应用


package mainimport "fmt"func TestGoroutine(str *string) {fmt.Println(*str)
}func Sum(slice []int, channel chan int) {sum := 0for _, num := range slice {sum += num}channel <- sum
}func main() {slice := []int{1, 2, 3, 4, 5, 10, 12, 30}ch1, ch2 := make(chan int), make(chan int)go Sum(slice[:len(slice) / 2], ch1)go Sum(slice[len(slice) / 2:], ch2)sum1, sum2 := <-ch1, <-ch2fmt.Println(sum1, sum2, sum1 + sum2)
}

2.2、信道/限制了大小的信道


设置大小的信道 一旦信道的空间被塞满了 一旦继续塞了之后则直接会被阻塞

创建出信道的格式是make(chan type, space int)


例如下面 所有的协程则将休眠

package mainimport "fmt"func main() {ch := make(chan int, 2)ch <- 1ch <- 2ch <- 3fmt.Println(<-ch)fmt.Println(<-ch)
}

在这里插入图片描述


2.3、信道/range close信道


rangeclose信道

close信道的时候 如果对方不听的进入range状态 则可以直接断开
range则是一直获取


下面是简单的例子 就用示例代码吧

package mainimport ("fmt"
)func fibonacci(n int, c chan int) {x, y := 0, 1for i := 0; i < n; i++ {c <- xx, y = y, x+y}close(c)
}func main() {c := make(chan int, 10)go fibonacci(cap(c), c)for i := range c {fmt.Println(i)}
}

运行效果
在这里插入图片描述


3.1、Select语句


select语句类似于IO多路复用了 只不过在这里和IO多路复用原理感觉是差不多的 但不多揣测
下面用示例代码当例子


package mainimport "fmt"func fibonacci(c, quit chan int) {x, y := 0, 1for {select {case c <- x:x, y = y, x+ycase <-quit:fmt.Println("quit")return}}
}func main() {c := make(chan int)quit := make(chan int)go func() {for i := 0; i < 10; i++ {fmt.Println(<-c)}quit <- 0}()fibonacci(c, quit)
}

运行效果
在这里插入图片描述


剩下的就是并发了 这个就交给项目中实际操作来熟悉了
今天主要花时间去填写资料了 剩下的就不说了

go的新手村先走在这里吧


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

相关文章

欧洲肿瘤生物学博士后申请经历

国外博士后的申请者经常会遇到各种问题&#xff0c;从而感叹申请过程的不易。知识人网小编推荐这篇申请经历&#xff0c;或许会给其他申请者带来一定启示。 作者从今年1月开始申请&#xff0c;5月份获得offer。以下是原文&#xff1a; 背景介绍&#xff1a;国内双非一本生物工…

Koa2基础笔记

目录 一、快速入门 二、中间件 链式调用 洋葱圈模型 异步处理 三、路由 koa-router 四、请求参数解析 处理URL参数 处理body参数 五、错误处理 原生的错误处理 使用中间件 一、快速入门 新建文件夹使用VSCode打开&#xff0c;终端运行npm init -y生成package.json…

SSM框架学习记录-Spring_day01

1.核心概念 当前项目中的问题 下面代码的实现十分简单&#xff0c;但是业务层需要调用数据层的方法&#xff0c;就要在业务层new数据层的对象&#xff0c;如果数据层的实现类发生变化&#xff0c;业务层的代码也需要跟着改变&#xff0c;意味着要编译打包和重新部署 // 数据层实…

TF-IDF

2.TF - IDF&#xff1a;作用&#xff1a;提取出来一句话中词的重要性&#xff0c;分成两个部分&#xff1a; tf: 词频(某一类中词条出现的次数 / 该类中所有词条数目) idf: 逆文档频率&#xff08;作用&#xff1a;去掉逗号&#xff0c;的等&#xff09;公式&#xff1a;idf l…

Android S(31) APP 页面绘制流程

接上一篇app 启动流程调用OnCreate方法&#xff0c;页面布局绘制进入setContentView 1、加载布局setContentView() 这里getWindow()直接返回mWindow&#xff0c;这个早在onCreate 调用前Activity#attach里面完成初始化。 进入attach方法&#xff0c;构建一个窗体对象PhoneWind…

365天深度学习训练营-第P2周:彩色图片识别

目录 一、前言 二、我的环境 三、代码实现 1、数据下载以及可视化 2、CNN模型 3、训练结果可视化 4、随机图像预测 四、模型优化 1、CNN模型 2、VGG-16模型 3、Alexnet模型 4、Resnet模型 一、前言 >- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]…

12.01 M4-UART-IT实验

1.使用CORTEX-M4核&#xff0c;实验中断实验和串口实验结合--->上传到CSDN 按键触发时&#xff0c;LED灯状态取反&#xff0c;并且在串口工具打印一句话 KEY1按键按下&#xff0c;LED1状态取反&#xff0c;串口工具打印key1 down!!!! 主要代码gpio.c void HAL_GPI…

SpringBoot实用开发之热部署

目录 热部署 手动启动热部署 自动启动热部署 热部署范围布置 关闭热部署 热部署 能学到spring boot实用开发篇的相信都已经对IDEA和maven了如指掌了&#xff0c;我就基于这些前置知识来说一下热部署&#xff0c;其实也很简单。 手动启动热部署 首先可以在你的pom.xml文…