go并发编程基础
go并发编程
1waitgroup
WaitGroup就是等待所有的goroutine全部执行完毕,add方式和Down方法要配套使用
package mainimport ("fmt""sync"
)func main() {var wq sync.WaitGroupwq.Add(100) //监控多少个goroutine执行结束for i:= 0;i<100;i++ {//开启一个协程go func(i int) {defer wq.Done() //和add是一起使用的fmt.Println(i)}(i)}wq.Wait() //等待所有的goroutine结束
}
2通过锁来完成全局变量的原子性操作
开启两个gorountine对total进行相同此时的加减,但是这一段程序的运行结果每一次都不一样
资源竞争,加锁
package mainimport ("fmt""sync"
)var total int
var wg sync.WaitGroupfunc main() {wg.Add(2)go add()go sub()wg.Wait()fmt.Println(total)
}
func add() {defer wg.Done()for i := 0; i < 100000; i++ {total += 1}
}func sub() {defer wg.Done()for i := 0; i < 100000; i++ {total -= 1}
}
加锁之后代码成功运行
package mainimport ("fmt""sync"
)var total int
var wg sync.WaitGroup
var lock sync.Mutexfunc main() {wg.Add(2)go add()go sub()wg.Wait()fmt.Println(total)
}
func add() {defer wg.Done()for i := 0; i < 100000; i++ {lock.Lock()total += 1lock.Unlock()}
}func sub() {defer wg.Done()for i := 0; i < 100000; i++ {lock.Lock()total -= 1lock.Unlock()}
}
锁不能复制。
更加优雅的方式,使用golang的原子包
package mainimport ("fmt""sync""sync/atomic"
)var total int64
var wg sync.WaitGroup//var lock sync.Mutexfunc main() {wg.Add(2)go add()go sub()wg.Wait()fmt.Println(total)
}
func add() {defer wg.Done()for i := 0; i < 100000; i++ {atomic.AddInt64(&total, 1) //原子性的操作}
}func sub() {defer wg.Done()for i := 0; i < 100000; i++ {atomic.AddInt64(&total,-1)}
}
lock相对atomic性能较差,lock基于操作系统调度
3读写锁
锁实际上是将并行的代码串行化了,使用lock肯定影响性能,即使是设计所,也应该尽量保证并行
4goroutine进行通讯
不要通过共享内存来通讯,而要通过通讯来实现内存共享
channel的基础用法
package mainimport "fmt"func main() {// 名字 类型 存储类型var msg chan string //默认值未nilmsg = make(chan string ,1) //channel的初始化的值如果是0的话,放值进去会阻塞,如果设为0就为无缓冲channelmsg <- "大大怪" //将右边的值放在channel中name := <- msg //将channel中的值取出来给namefmt.Println(name)}
无缓冲channel用法
package mainimport ("fmt""time"
)func main() {// 名字 类型 存储类型var msg chan string //默认值未nilmsg = make(chan string, 0) //channel的初始化的值如果是0的话,放值进去会阻塞,如果设为0就为无缓冲channelgo func(msg chan string) {name := <-msg //将channel中的值取出来给namefmt.Println(name)}(msg)msg <- "大大怪" //将右边的值放在channel中time.Sleep(time.Second*10)}
waitgroup少了一个done容易出现deadlock
无缓冲的channel也容易出现deadlock
适用场景
无缓冲channel适用于通知B要第一时间知道A是否已经完成
有缓冲channel适用于生产者和消费者之间的通讯
go中channel的应用场景
- 消息传递,消息过滤
- 信号广播
- 事件订阅和广播
- 任务分发
- 结果汇总
- 并发控制
- 同步和异步
5.单项channel的使用
默认情况下,channel是双向的,但是我们经常一个channel作为参数进行传递,希望对象也是单向使用
package mainimport "fmt"func main() {//var ch1 chan int //双向的channel//var ch2 chan<- float64 //单项channel,只能写入float64的数据//var ch3 <-chan int //只能读取int类型的数据/*定义一个channel然后把它编程单向的,但是不能把单项的channel转成双向的channel*/c := make(chan int, 3)var send chan<- int = cvar read <-chan int = csend <- 1num := <- readfmt.Println(num)
}
模拟单项channel存取数据
package mainimport ("fmt""time"
)func producer(out chan<- int) {for i:=0;i<10 ;i++ {out <- i*i}close(out)
}func consumer(in <-chan int) {for num := range in {fmt.Println(num)}
}
func main() {/*内部会完成自动的类型转换*/c := make(chan int)go producer(c)go consumer(c)time.Sleep(10*time.Second)
}
6交替打印
这是一道经典题目,在Java中也有提到,交替打印这个序列
12ab34cd56ef78gh910ij1112kl1314mn1516op1718qr1920st2122uv2324wx2526yz2728
利用channel阻塞的特性来实现
package mainimport ("fmt""time"
)var number, letter = make(chan bool), make(chan bool)func printNum() {i := 1for {//等待另外一个goroutine进行通知<-number //从number进行取值的操作,如果没有值就阻塞fmt.Printf("%d%d", i, i+1)i += 2letter <- true}
}
func printLetter() {str := "abcdefghijklmnopqrstuvwxyz"i := 0for {<-letterif i>= len(str){return}fmt.Print(str[i : i+2])i += 2number <- true // 存入true到channel中}
}func main() {go printNum()go printLetter()number <- truetime.Sleep(10*time.Second)
}相关文章:
go并发编程基础
go并发编程 1waitgroup WaitGroup就是等待所有的goroutine全部执行完毕,add方式和Down方法要配套使用 package mainimport ("fmt""sync" )func main() {var wq sync.WaitGroupwq.Add(100) //监控多少个goroutine执行结束for i: 0;i<100;…...
PHP之 导入excel表格时,获取日期时间变成浮点数
读取到的时间 float(0.20833333333333) 原格式 15:00:00 代码 if (Request::isPost()) {$file_url input(upfile); // 本地上传文件地址// 读取文件内容$local_file_url __dir__./../../../public.$file_url;// $spreadsheet new Spreadsheet();// $sheet $spreadsheet-…...
学习 Java 报表技术导入 Maven 依赖出错:jacob 无法下载、jasperreports 依赖错误
发生缘由 最近在做一个可视化项目,用到了 Java 报表技术。在跟着「黑马」课程导入 pom.xml 文件的时候提示下载依赖错误。 com.jacob 包无法下载Failed to read artifact descriptor for com.lowagie:itext:jar:2.1.7.js6 运行环境 电脑系统版本:Win…...
力扣-哈希-最长连续序列
题目 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: **输入:**nums [100,4,200,1,3,2] **输出&a…...
Java线程 - 详解(1)
一,创建线程 方法一:继承Thread类 class MyThread extends Thread{Overridepublic void run() {System.out.println("线程1");} }public class Test {public static void main(String[] args) {MyThread myThread new MyThread();myThread.…...
结构体-C语言(初阶)
目录 一、结构体声明 1.1 结构概念 1.2 结构声明 1.3 结构成员的类型 1.4 结构体变量的定义和初始化 二、结构体成员的访问 2.1 结构体变量访问成员 2.2 结构体指针访问指向变量的成员 三、结构体传参 一、结构体声明 1.1 结构概念 结构是一些值的集合,这些值称为…...
【网络】HTTPS的加密
目录 第一组,非对称加密第二组,非对称加密第三组,对称加密证书签名 HTTPS使用的是非对称加密加对称加密的方案 (非对称加密:公钥加/解密,私钥解/加密) (对称加密:一组对称…...
Nacos安装指南
Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码: GitHub主页:https://github.com/alibaba/nacos GitHub的Release下载…...
java-Optional 类详解
目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法: get用法: filter用法: orElse用法: orElseGet用法 orElseThrow用法 map用法 flatMap用法: 前言 Optional 类是java8的新特性࿰…...
sql数据库怎么备份,sql 实时备份
在当今互联网时代,数据已经成为企业的核心资产。然而,数据的安全性和完整性面临硬件问题、软件故障、人工操作错误等各种威胁。为了保证数据的安全,实时备份已经成为公司必须采取的重要措施之一。下面我们就重点介绍SQL实时备份的重要实施方法…...
RK3399平台开发系列讲解(存储篇)Linux 存储系统的 I/O 栈
平台内核版本安卓版本RK3399Linux4.4Android7.1🚀返回专栏总目录 文章目录 一、Linux 存储系统全景二、Linux 存储系统的缓存沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 存储系统的 I/O 原理。 一、Linux 存储系统全景 我们可以把 Linux 存储系…...
Java“牵手”天猫淘口令转换API接口数据,天猫API接口申请指南
天猫平台商品淘口令接口是开放平台提供的一种API接口,通过调用API接口,开发者可以获取天猫商品的标题、价格、库存、商品快递费用,宝贝ID,发货地,区域ID,快递费用,月销量、总销量、库存、详情描…...
postgresql 条件表达式
postgresql 条件表达式 简单CASE表达式搜索CASE表达式缩写函数nullif函数示例 coalesce函数 总结 简单CASE表达式 语法如下 case 表达式when 值1 then 结果1when 值2 then 结果2else 默认值 end;select e.first_name , e.last_name , case e.department_id when 90 then 管…...
姜启源数学模型第五版第五章火箭发射升空
姜启源数学模型第五版第五章例题内容复现 数学建模背景1.学习内容火箭发射升空理论知识 2.例题3.问题分析不考虑空气阻力的模型考虑空气阻力的模型 4.代码内容复现不考虑空气阻力考虑空气阻力模型 数学建模背景 首先先简单的介绍数学建模是一个怎么样的内容 数学建模是一种将数…...
局域网中电脑共享文件给手机
学习资源: 局域网共享:这样设置,你可以轻松拷贝任何电脑的文件。_哔哩哔哩_bilibili 可以实现什么效果? 连接同一个WIFI,电脑端为服务端,提供共享文件,手机是客户端,可以读取服务端…...
线段树练习
P1198 [JSOI2008] 最大数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) // Problem: P1198 [JSOI2008] 最大数 // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1198 // Memory Limit: 128 MB // Time Limit: 1000 ms // // Powered by CP Editor (https://c…...
Mybatis映射.动态sql.分页
介绍: 动态SQL是MyBatis提供的一种动态生成SQL语句的方式,可以根据不同的条件生成不同的SQL语句,从而实现更加灵活的查询和操作。 在MyBatis的映射文件中,可以通过使用if、choose、when、otherwise、foreach等标签来实现动态SQL…...
springboot向resources下写文件的两种方式
文章目录 方式一:方式二: 方式一: import java.io.File; import java.io.FileWriter; import java.io.IOException;public class WriterFileUtils {private static final String prefix "classpath:";public static void writeFi…...
Sloare flare网卡信息
详细的安装信息 https://github.com/Xilinx-CNS/onload/tree/master/scripts 进行下载 Solarflare网卡开发:openonload 安装与调试_openonload安装_Erice_s的博客-CSDN博客 cns-sfnettest测试 cns-sfnettest 下载 https://github.com/Xilinx-CNS/cns-sfnettes…...
Redis知识点整理
第一部分:Redis基础知识点 1、数据类型 5种常用基础类型:string,hash,list,set,zset – 字符串,Hash表,List顺序集合,Set无序集合,ZSet有序集合3中特殊类型:bitmap-字节地图, hyperloglog-统计…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
