Golang 并发编程

Golang 并发编程

Goroutine

什么是协程

创建 Goroutine

主 goroutine (main函数)退出后,其它的工作 goroutine 也会自动退出

package mainimport ("fmt""time"
)func myFunc() {i := 0for {i++fmt.Println("func: ", i)time.Sleep(1 * time.Second)}
}func main() {go myFunc()i := 0for {i++fmt.Println("main: ", i)time.Sleep(1 * time.Second)}
}
main:  1
func:  1
func:  2
main:  2

Goexit 函数

调用 runtime.Goexit() 将立即终止当前 goroutine 执⾏

func myFunc() {i := 0for {i++fmt.Println("func: ", i)time.Sleep(1 * time.Second)if i == 10 {fmt.Println("func OVER ~")runtime.Goexit()}}
}func main() {go myFunc()i := 0for {i++fmt.Println("main: ", i)time.Sleep(1 * time.Second)}
}
...
func:  9
main:  9
main:  10
func:  10
func OVER ~
main:  11
main:  12
...

匿名函数

func main() {func() {fmt.Println("hello, I don't have name.")}()
}
func main() {fun := func() {fmt.Println("hello, I don't have name.")}fun()
}

Channel

什么是 Channel

channel 用来解决go程的同步问题以及go程之间数据共享(数据传递)的问题。

⽤类型 channel可用于多个 goroutine 通讯。其内部实现了同步,确保并发安全。

创建管道

package mainimport ("fmt""time"
)var c chan intfunc f(name string) {for {i := <-cfmt.Println(name, ": ", i)i++c <- itime.Sleep(1 * time.Second)}
}func main() {c = make(chan int)go f("fun1")go f("fun2")c <- 0for {}
}
fun2 :  0
fun1 :  1
fun2 :  2
fun1 :  3
fun2 :  4
fun1 :  5
fun2 :  6

Channel 的缓冲

无缓冲:通道不保存数据,生产者会等待消费者,将数据放到管道中。

有缓存:类似消息队列,可以保存在管道中。

package mainimport ("fmt""time"
)var c chan intfunc f(name string) {for {i := <-cfmt.Println(name, ": ", i)i++c <- itime.Sleep(10 * time.Millisecond)}
}func main() {// 有缓冲的 Channelc = make(chan int, 1)go f("fun1")go f("fun2")c <- 0time.Sleep(1 * time.Second)
}

会产生同一个 go 程会执行多次的效果

image-20240809153821768
func main() {// 无缓冲的 Channelc = make(chan int)go f("fun1")go f("fun2")c <- 0time.Sleep(1 * time.Second)
}

两个 go 程交替运行,channel 作为锁,相互阻塞线程。

image-20240809153902951

关闭 channel

package mainimport ("fmt"
)func main() {c := make(chan int)go func() {for i := 0; i < 5; i++ {c <- i}close(c)}()for {// ok为true说明channel没有关闭,为false说明管道已经关闭if data, ok := <-c; ok {fmt.Println(data)} else {break}}fmt.Println("Finished")
}

range 函数

可以用 range 迭代操作 channel

package mainimport ("fmt"
)func main() {c := make(chan int)go func() {for i := 0; i < 5; i++ {c <- i}close(c)}()for data := range c {fmt.Println(data)}fmt.Println("Finished")
}

select 函数

用于多路监控 channel

package mainimport ("fmt"
)func fibonacci(c, quit chan int) {x, y := 1, 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 < 6; i++ {fmt.Println(<-c)}quit <- 0}()fibonacci(c, quit)
}

Go Modules

配置

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

创建项目

go mod init github.com/wmh1024/demo_module
go get xxxx

replace

修改模块的版本依赖关系

go mod edit -replace=zinx@v0.0.0-20200306023939-bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/397226.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:表的设计原则和聚合函数

所属专栏&#xff1a;MySQL学习 &#x1f48e;1. 表的设计原则 1. 从需求中找到类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性对应着表中的字段 2. 确定类与类的对应关系 3. 使用SQL去创建具体的表 范式&#xff1…

从“抠图”到“抠视频”,Meta上新AI工具SAM 2。

继2023年4月首次推出SAM&#xff0c;实现对图像的精准分割后&#xff0c;Meta于北京时间2024年7月30日推出了能够分割视频的新模型SAM 2&#xff08;Segment Anything Model 2&#xff09;。SAM 2将图像分割和视频分割功能整合到一个模型中。所谓“分割”&#xff0c;是指区别视…

API 签名认证:AK(Access Key 访问密钥)和 SK(Secret Key 私密密钥)

API签名认证 在当今的互联网时代&#xff0c;API作为服务与服务、应用程序与应用程序之间通信的重要手段&#xff0c;其安全性不容忽视。你是否遇到过需要在HTTP请求中加入访问密钥(ak)和私密密钥(sk)的情况&#xff1f;是不是担心这些敏感信息会被拦截或者泄露&#xff1f;本…

【多线程】乐观/悲观锁、重量级/轻量级锁、挂起等待/自旋锁、公平/非公锁、可重入/不可重入锁、读写锁

文章目录 乐观锁和悲观锁重量级锁和轻量级锁挂起等待锁和自旋锁公平锁和非公平锁可重入锁和不可重入锁读写锁相关面试题 锁&#xff1a;非常广义的概念&#xff0c;不是指某个具体的锁&#xff0c;所有的锁都可以往这些策略中套 synchronized&#xff1a;只是市面上五花八门的锁…

[独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 (多输入单输出)Matlab代码

[独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 &#xff08;多输入单输出&#xff09;Matlab代码 目录 [独家原创]基于分位数回归的Bayes-GRU多变量时序预测【区间预测】 &#xff08;多输入单输出&#xff09;Matlab代码效果一览基本介绍程序设计参考资料 效…

RM麦轮控制以及底盘解算

一个典型的RM机器人四轮底盘由电机&#xff0c;底板&#xff0c;悬挂等构成&#xff0c;底盘安装在底盘的四角&#xff0c;呈矩形分布&#xff0c;麦克纳姆轮的辊子方向会影响其运动性能&#xff0c;一般采用如下图所示&#xff0c;四个麦轮的辊子延长线都过底盘中心的安装方法…

c语言学习,atoi()函数分析

1&#xff1a;atoi() 函数说明&#xff1a; 检查参数*ptr&#xff0c;子串中数字或正负号&#xff0c;遇到非数字或结束符停止 2&#xff1a;函数原型&#xff1a; int atoi(const char *ptr) 3&#xff1a;函数参数&#xff1a; 参数c&#xff0c;为检测子串 4&#xff1a;…

MyBatis 配置与测试方式

目录 一&#xff0c;什么是MyBatis 二&#xff0c;准备工作 创建项目 配置数据库连接 持久层代码 单元测试 一&#xff0c;什么是MyBatis 简单来说&#xff0c;MyBatis 是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发&#xff0c;能更简单完成程序与数据库之间…

从0到1,AI我来了- (5)大模型-本地知识库-I

一、下载&安装Ollama Ollama下载地址&#xff1a; Download Ollama on macOS Github地址&#xff1a;GitHub - ollama/ollama: Get up and running with Llama 3.1, Mistral, Gemma 2, and other large language models. Ollama 是啥&#xff1f; 是一个人工智能和机器学习…

一文搞懂后端面试之不停机数据迁移【中间件 | 数据库 | MySQL | 数据一致性】

数据迁移方面的工作&#xff1a; 重构老系统&#xff1a;使用新的表结构来存储数据单库拆分分库分表、分库分表扩容大表修改表结构定义 数据备份工具 MySQL上常用的两款数据备份工具&#xff1a;mysqldump和XtraBackup mysqldump&#xff1a;一个用于备份和恢复数据库的命令…

Redis中的set类型

set的含义 集合设置&#xff08;和get相对应&#xff09; 集合就是把一些有关联的数据放到一起 集合中的元素是无序的&#xff08;和list的有序是对应的-顺序很重要&#xff0c;这里的无序就是顺序不重要&#xff09;&#xff1b;在list中[]1,2,3],[1,3,2]&#xff0c;是两个…

Java开发工具IDEA

IDEA概述 Intellij IDEA IDEA全称Intellij IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 IDEA下载和安…

PDF在线预览实现:如何使用vue-pdf-embed实现前端PDF在线阅读

目录 PDF在线预览实现&#xff1a;如何使用vue-pdf-embed实现前端PDF在线阅读 一、前言 二、vue-pdf-embed是什么 1、作用与场景 2、vue-pdf-embed的优点 三、项目初始化与依赖安装 1、初始化Vue项目 2、安装依赖 3、集成vue-pdf-embed插件 四、一个实际的应用demo …

Java面试题精选:消息队列(一)

1、为什么使用消息队列 问题用意&#xff1a; 其实就是想问一下消息队列有哪些使用场景&#xff0c;你项目中什么业务场景用到了消息队列&#xff0c;有什么技术挑战。使用MQ后给你带来了什么好处 规范回答&#xff1a; 消息队列的常见使用场景很多&#xff0c;但比较核心的…

【漏洞修复】Tomcat中间件漏洞

1.CVE-2017-12615 抓包上传一句话木马 密码passwd 2.后台弱口令部署war包 先用弱口令登录网站后台 制作war包 将172.jsp压缩成.zip文件&#xff0c;修改后缀为.war 上传 蚁剑链接 3.CVE-2020-1938 Python2 CVE-2020-1938.py IP -p 端口 -f 要读取的文件 漏洞修复&#xf…

超越自我——带你学haproxy算法一遍过!!!

文章目录 前言介绍 静态算法static-rrfirst 动态算法roundrobinleastconn 其他算法source算法map-base 取模法一致性hashuriurI_param 取模法hdr 总结本文相关连接如下&#xff1a; 前言 本文相关连接如下&#xff1a; 如果想更多了解haproxy的相关知识&#xff0c;请点击&am…

HTTP协议和运行原理

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。不仅仅适用于[服务器<–>客户端]也是适用于[服务器<–>服务器] HTTP 状态码 1xx 1xx 类状态码属于提示信息&#xff0c;是协议处理中的一种中间状态&#xff0c;实际…

操作系统 IO 相关知识

操作系统 IO 相关知识 阻塞与非阻塞同步与异步IO 和系统调用传统的 IODMAmmap 内存映射sendfilesplice 常用的 IO 模型BIO&#xff1a;同步阻塞 IONIO&#xff1a;同步非阻塞 IOIO 多路复用信号驱动 IOAIO&#xff1a;异步 IO 模型 IO 就是计算机内部与外部进行数据传输的过程&…

加密案例分享:电子设备制造行业

企业核心诉求选择 1.某企业规模庞大&#xff0c;分支众多&#xff0c;数据安全管理方面极为复杂&#xff1b; 2.企业结构复杂&#xff0c;包括研发、销售、财务、总部、分部、办事处、销售等单位连结成为一个庞大的企业组织&#xff0c;数据产生、存储、流转、使用、销毁变化…

NIO线程模型

NIO线程模型主要涉及以下几个方面&#xff1a; 一、基本概念 NIO&#xff08;New Input/Output&#xff09;是Java的一种新的输入输出模型&#xff0c;也被称为非阻塞IO。其核心特点是数据读写操作均是非阻塞的&#xff0c;即在进行读写操作时&#xff0c;若数据未准备好&…