4.2 并发技术:多协程

创建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语言高级)