版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
合作:(IT营 四、Goroutine的使用以及 五、启动多个 六、设置Golang并行运行的时候占用的cup数 七、Goroutine统计素 八、Channel管 2、创建 九、Goroutine结合Channel管 十、Golang并发安全和 候就用到了goroutine5种基本状态,它们是:初始态,执行态,是进程的一个执行实例,是程序执行的最小单元,它是比进程更小的能独立运行的基行,如果线程数大于CPU核数,则多线程程序在多个CPU上面运行既有并行又有并发上可以起多个协程。Golang中多协程可以实现并行或者并发。完全由用户自己的程序进行调度的。Golang的一大特色就是从语言层面原生支持协程,在函数或者方法前面加go关键字就可创建一个协程。可以说Golang中的协程就是goroutine。多协程和多线程:Golanggoroutine协程)Java、COS线程(操作系统线程)一般都有固定的栈内存(2MB左右),goroutine程2KB左右,goroutine切换调度开销方面远比线程要少。这也是为什么越来越多的大公司使用Golang的之一。在主线也每隔50毫秒输出"你好golang",输出10次后,程序,要求主线import()functest()fori:=1;i<=10;i++fmt.Println("tesst() }}funcmain()gotest()//fori:=1;i<=10;i++fmt.Println("main() } import()functest(){fori:=1;i<=10;i++fmt.Println("test()golangfuncmain()gotest()fori:=1;i<=2;i++time.Sleep(time.Millisecond*50) o(iint){ oGoroutine!",i)}funcmain()fori:=0;i<10;i++wg.Add(1)//启动一个goroutine就登记+1 10GoGOMAXPROCSOSGo时调度到8个OS线Goruntime.GOMAXPROCS()CPU逻辑Go1.5版本之前,默认使用的是单执行。Go1.5版本,默认使用全部的CPU逻辑核import)funcmain()cpuNum:=fmt.Println("cpuNum=",runtime.GOMAXPROCS(cpuNum-funcfuncmain()start:=fornum:=1;num<=120000;flagtrue假设是素数fori:=2;i<num;i++{}}ifflag//}}end:=}import)funcfn1(nint){fornum:=(n-1)*30000+1;num<=n*30000;flagtrue假设是素数fori:=2;i<num;i++{ifnum%i==0}}ifflag//}}}funcmain()fori:=1;i<=4;i++{gofn1(i)end:= 使用了goroutine已经能大大的提升新能了,但是如果 Golanggoroutine间的通讯方式,可以使用channel在之间的连接。channelgoroutinegoroutine的通信机制。Go语言中的管道(channel)是一种特殊的类型。管道像一个传送带或者队列,总是遵循先入先出(FirstInFirstOut)的规则,保证收发数据的顺序。每一个管道都是一个具体类型的导管,也就是channel的时候需要为其指定元素类型。varchanvarch1varchanvarch1chan varch2chan varch3chan[]int make(chan元素类型,容量make(chan元素类型,容量ch1:=make(chanint, ch2:=make(chanbool, ch3:=make(chan[]int, chch:=make(chanint,<-xxch从ch goroutine所有的数据都发送完毕的时操作关闭文件是必须要做的,但关闭管道不是必须的。funcmain()chfuncmain()ch:=make(chanint)ch<-10}fatalfatalerror:allgoroutinesareasleep-goroutine1[chanD:/go_demo/demo21/07goroutine/main.go:10+0x5bexitstatus2make函数初始化funcfuncmain()chmake(chanint,1)1ch<-}funcfuncmain()ch<-10ch<-funcfuncmain()ch10ch12 当管道被关闭时,再往该管道发送值会panic,从该管道取值的操作会先取完管道中的packagepackagemainimportfuncfuncmain()varch1=make(chanint,5)fori:=0;i<5;i++{ch1<-i+1close(ch1)关闭管道 forrange,如果没有关闭管fatalerror:allgoroutinesareasleep-//forrangekeyforval:=rangech1{ 2、开启一个fn2的协程han中写入的数import()varwgsync.WaitGroupfuncfn1(intChanchanint){fori:=0;i<100;{intChan<-i+1time.Sleep(time.Millisecond*100)}}funcfn2(intChanchan{forv:=rangeintChanfmt.Printf("readData读到数据=%v\n",v)time.Sleep(time.Millisecond*50)}}funcmain()go import)varwg//intChan1-120000{fori:=1;i<=1000;i++intChan<-}}//intChan取出数据,并判断是否为素数,funcm(intChanchanint,primeChanchanint,exitChanchanbool){varflagbool=truefori:=2;i<num;i++{}}ifflagprimeChan<-num}}}{forv:=rangeprimeChan{}}funcmain()start:=time.Now().Unix()exitChanmake(chanbool8)8//intChan1-8000gofori:=0;i<8;i++{goprim(intChan,primeChan,}gogofunc()fori:=0;i<8;i++} 从exitChan取出了8个结果,就可以放心的关闭prprimeChanfmt.Println(end-start) //1.//1.varchan2chan<-chan2<-20//num:=<-chan2num2:=<-//chan3<-30//err传统的方法在遍历管道时,如果不关闭会阻塞而导致deadlock}
data,ok:=<-data,ok:=<-…景,Go内置了select关键字,可以同时响应多个管道的操作。selectswitchcasecase会对时,就会执行case分支对应的语句。具体格式如下:case<-casedata:=<-casech3<-}import()funcmain()塞而导致deadlock,在实际开发中,可能 intChan:=make(chanint,10)fori:=0;i<10;{intChan<-}stringChan:=make(chanstring,5)fori:=0;i<5;i++{stringChan<-"o"+fmt.Sprintf("%d",}forselect//注意:intChandeadlock,会自动到下一个case匹配casev:=<-fmt.Printf("从intChan的数据%d\n",v)casev:=<-fmt.Printf("从stringChan的数据%s\n",v)fmt.Printf("都取不到了,不玩了程序员可以加入逻辑\n")来。要求使用goroutine完成。import_varmyMap=testn!,让将这个结果放入到functest(nint)res:=fori:=1;i<=n;{res*=funcmain()fori:=1;i<=60;gotest(i)fori,v:=range{fmt.Printf("map[%d]=%d\n",i,互斥锁是一种常用的控制共享资源的方法,它能够保证同时只有一个goroutine可以访问共享资源。GosyncMuteximport_)var )testn!,myMapfunctest(nint){res:=fori:=1;i<=n;{res*=}}funcmain()forfori:=1;i<=60;{gofori,v:=range{fmt.Printf("map[%d]=%d\n",i,并不利于多个协程对全局变量的读写操作。这个时候也可以通过另式来实现上面的互斥锁是完全互斥的,但是有很多实际的场景下是读多写少的,当并发的去一个资写锁在Go语言中使用sync包中的RWMutex类型。取读锁会继续获得锁,如果是获取写锁就会等待;当一个goroutine获取写锁,其他的goroutine无论是获取读锁还是写锁都会等待。varvar rwlocksync.RWMutex)funcwrite()// x=x+) // funcread()//) // funcmain()start:=fori:=0;i<10;{gofori:=0;i<1000;i++goend:=packagepackagemainimport()func o()fori:=0;i<10;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- T/SXJP 066-2023冷鲜猪肉
- T/SZBX 106-2022农家乐餐饮服务规范
- T/EPIAJL 3-2019 T/LEPA 1-2019超期服役火电机组寿命评估技术细则
- T/CI 1259-2025填料硫酸钙 (MR硫酸钙)
- T/CAAM 0004-2025频谱热疗房
- T/COEMA 25-2026激光安全员岗位规范
- 2025~2026学年河南省安阳市滑县人教版六年级上册12月月考数学试卷【附答案】
- 2025~2026学年安徽合肥市庐江县苏教版第二册四年级数册末质量检测试卷(A卷)【附答案】
- 2025-2026学年湖北省宜都市初中历史九年级期末下册通关重点试题(附答案)
- 2025-2026学年四川省攀枝花市初中历史九年级期末下册自我评估黑金试卷(附答案)
- 2026年网信办网络舆情管理岗笔试真题(含答案)
- 2026“外研社·国才杯”“理解当代中国”外语能力国际传播综合能力赛项真题及答案解析(10月11日上午场次)
- 2026年七年级数学竞赛试题及答案
- 河南2027届高三年级过程性作业评价(青桐鸣)联考数学+答案
- 2024 人身保险伤残评定及代码
- 九年级上册英语完形填空100篇(含答案解析)
- 2026全国《安全生产法及重大事故隐患判定》竞赛知识考试题库与答案
- 教育评价学教学课件
- 老年患者呼吸困难护理
- 2026年物流师职业能力等级认证考试(中级)考前冲刺试题及答案
- 建筑工程竣工验收报告贵州版
评论
0/150
提交评论