首页 > 其他分享 >go基础系列~并发协程

go基础系列~并发协程

时间:2022-08-21 09:55:18浏览次数:91  
标签:WaitGroup 协程 Lock goroutine 并发 线程 go

零 基础
协程 一种比线程更加轻量级的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程,协程的切换和创建完全是用户决定的
goroutine相对于线程:
1.Goroutine所需要的内存通常只有2kb,而线程则需要1Mb,内存消耗更少
2.由于线程创建时需要向操作系统申请资源,并且在销毁时将资源归还,因此它的创建和销毁的开销比较大。相比之下,goroutine的创建和销毁是由go语言在运行时自己管理的,因此开销更低。
3.切换开销更小线程的调度方式是抢占式的,如果一个线程的执行时间超过了分配给它的时间片,就会被其它可执行的线程抢占;而goroutine的调度是协同式的,它不会直接地与操作系统内核打交道


一  Mutex 互斥锁-Mutex是结构体
在同一时间段内有且只有一个goroutine持有锁,保证了在这段时间内只有一个goroutine访问共享资源,其他申请锁的goroutine将会被阻塞直到释放
常用函数 Lock() Unlock()
在Lock()和Unlock()之间的代码部分是临界区
var lock sync.Mutex //定义
go func(){
defer lock.Unlock()
lock.Lock()
//下面整套处理逻辑都是临界区
fmt.Prinln(time.now())
}

二   RWMutex 读写锁
R(Lock|UnLock) W(Lock|Unlock)
1 在同一个时间段内只能有一个goroutine获取到写锁
2 在同一个时间段内可以有多个goroutine获取到读锁
3 在同一时间段在只能存在写锁或者读锁(读锁和写锁互斥)
三   WaitGroup 并发等待组
var gp sync.WaitGroup
for i:=0;i<=5;i++{
gp.Add(1)
go func(i int) {
defer gp.Done()
fmt.Println("加锁",i)
time.Sleep(3)
fmt.Println("释放锁",i)
}(i)

}
fmt.Println("锁等待")
gp.Wait()
1 使用WaitGroup的goroutine会等待预设好数量的goroutine都提交执行结束后,才会继续往下执行代码
2 在goroutine调用WaitGroup之前我们需要保证WaitGroup中等待数据大于1
3 保证WaitGroup.Done()执行的次数与WaitGroup.Add()相同,过少会导致等待goroutine死锁,过多会导致painic

标签:WaitGroup,协程,Lock,goroutine,并发,线程,go
From: https://www.cnblogs.com/danhuangpai/p/16609370.html

相关文章

  • GP中的并发控制
    Greenplum数据库使用了PostgreSQL的多版本并发控制(MVCC)模型来管理对于堆表的并发事务。 铜锅MVCC,每一个查询都在它开始时的一个数据库快照上操作。在执行时,一个查询不能......
  • netcore MongoDB
    NuGet MongoDB.DriverusingMongoDB.Bson;usingMongoDB.Driver;usingSystem;namespaceMongoTest{publicclassMongoHp{staticMongoHp()......
  • [Google] LeetCode 1048 Longest String Chain
    YouaregivenanarrayofwordswhereeachwordconsistsoflowercaseEnglishletters.\(word_A\)isapredecessorof\(word_B\)ifandonlyifwecaninserte......
  • django rest framework快速使用
    一、安装相关的依赖$pipinstalldjangorestframework$pipinstallmarkdown#MarkdownsupportforthebrowsableAPI.$pipinstalldjango-filter#Filt......
  • [Google] LeetCode 2115 Find All Possible Recipes from Given Supplies
    Youhaveinformationaboutndifferentrecipes.Youaregivenastringarrayrecipesanda2Dstringarrayingredients.The\(i\)-threcipehasthenamerecipe......
  • Vulfocus靶场 | Django SQL注入(CVE-2021-35042)
    漏洞复现这题通关比较简单,但是django这个漏洞还挺出名的,之前在ctf上也遇到过相关的题目\ 直接按照提示,进入了Django报错页面 flag就在里面,直接ctrl+F就能找到......
  • Vulfocus靶场 | GoCD 任意文件读取漏洞 (CVE-2021-43287)
    漏洞描述GoCD一款先进的持续集成和发布管理系统,由ThoughtWorks开发。(不要和Google的编程语言Go混淆了!)其前身为CruiseControl,是ThoughtWorks在做咨询和交付交付项目时......
  • Typora+picgo+github图片及文件上传
    一、本地文件上传github右上角newrepository复制https连接在本地下载:git然后找到你要上传的文件夹项目,右键点击文件夹(注意:不能选单个文件或者压缩包......
  • [Google] LeetCode 2034 Stock Price Fluctuation
    Youaregivenastreamofrecordsaboutaparticularstock.Eachrecordcontainsatimestampandthecorrespondingpriceofthestockatthattimestamp.Unfort......
  • 并发并行
    并发并行并发在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运......