创建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