0
点赞
收藏
分享

微信扫一扫

并发技术2:多协程

纽二 2022-02-19 阅读 44


创建Goroutine

import (
"fmt"
"time"
)

func newTask() {
for {
fmt.Println("劳资是子协程")
time.Sleep(time.Second)
}
}

func main() {

//开一条协程,与主协程并发地执行newTask()
go newTask()

//主协程赖着不死,主协程如果死了,子协程也得陪着死
for {
fmt.Println("this is a main goroutine")
time.Sleep(time.Second)
}

}

出让协程资源

通过runtime.Gosched()出让协程资源,让其他协程优先执行

package main

import (
"fmt"
"runtime"
)

func main() {

go func() {
for i := 0; i < 5; i++ {
fmt.Println("go")
}
}()

for i := 0; i < 2; i++ {
//让出时间片,先让别的协程执行,它执行完,再回来执行此协程
//(詹姆斯协程:先排档期,你们先上)
runtime.Gosched()
fmt.Println("hello")
}

}

协程自杀

package main

import (
"fmt"
"runtime"
"time"
)

func test() {
//遗嘱:临终前说的话
defer fmt.Println("这是test的遗嘱")
//自杀,触发提前执行遗嘱,暴毙,后边的好日子不过了,调用它的协程也暴毙
runtime.Goexit()
//自杀了,后边的好日子不过了
fmt.Println("生活承诺的很多美好事情...")
//到这是test的正常退出
}

func wildMan() {
for i:=0;i<6;i++{
fmt.Println("我是野人,我不喜欢约束,我讨厌制约的我的主协程")
time.Sleep(time.Second)
}
}

func main() {

//一个会暴毙的协程
go func() {
fmt.Println("aaaaaaaaaaaaaa")
//test中有协程自杀程序runtime.Goexit()
test()
fmt.Println("bbbbbbbbbbbbbbb")
}()

//一个讨厌主协程约束的野人协程,主协程正常结束会把她带走
//如果主协程暴毙,则野人协程失去约束
go wildMan()

for i:=0;i<3;i++ {
time.Sleep(time.Second)
}

//主协程的暴毙,会令所有子协程失去牵制——野人永远失去控制
//主协程暴毙的情况下,如果所有协程都结束了,程序崩溃:fatal error: no goroutines (main called runtime.Goexit) - deadlock!
runtime.Goexit()
fmt.Println("主协程正常返回,会带走所有子协程")

}

查看可用内核数

package main

import (
"fmt"
"runtime"
)

/*
可用内核越多,并发质量越高
*/

func main() {
//把可用的最大逻辑CPU核心数设为1,返回先前的设置
previousMaxProcs := runtime.GOMAXPROCS(1)

//获得逻辑CPU核心数
cpu_num := runtime.NumCPU()
fmt.Println("cpu_num = ", cpu_num)//8
fmt.Println("previousMaxProcs=",previousMaxProcs)//8

for {
//主协程打0,子协程打1
go fmt.Print(1)
fmt.Print(0)
}
}

协程间公平竞争资源

package main

import (
"fmt"
"time"
)

func PrinterVII(str string) {
for _, data := range str {
fmt.Printf("%c", data)
time.Sleep(time.Second)
}
fmt.Printf("\n")
}

func person1VII() {
PrinterVII("今生注定我爱你")
}

func person2VII() {
PrinterVII("FUCKOFF")
}

func main() {
go person1VII()
go person2VII()

for {
time.Sleep(time.Second)
}
}

学院Go语言视频主页

​​清华团队带你实战区块链开发​​

获取海量视频及源码 QQ群:721929980




举报

相关推荐

0 条评论