併發技術2:多協程

尹成發表於2018-11-16

建立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語言視訊主頁
https://edu.csdn.net/lecturer/1928

[清華團隊帶你實戰區塊鏈開發]

(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980

在這裡插入圖片描述

相關文章