併發技術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語言視訊主頁
https://edu.csdn.net/lecturer/1928
[清華團隊帶你實戰區塊鏈開發]
(https://ke.qq.com/course/344443?tuin=3d17195d)
掃碼獲取海量視訊及原始碼 QQ群:721929980
相關文章
- 併發技術4:同步排程
- Go 併發 -- 協程Go
- Go多協程併發環境下的錯誤處理Go
- 多執行緒與併發-----Lock鎖技術執行緒
- PHP協程:併發 shell_execPHP
- 高併發技術
- 併發技術1:CSP併發理論
- Golang協程併發的流水線模型Golang模型
- GO-併發技術Go
- 併發技術中同步
- Go 併發程式設計 - runtime 協程排程(三)Go程式設計
- 使用socket+gevent實現協程併發
- Android技術分享| 利用Kotlin協程,多工並行,測試RTM SDK效能AndroidKotlin並行
- 5. 併發神奇——協程 |《 刻意學習 Golang 》Golang
- 雲流送技術原理是什麼,如何實現多併發?
- [仁潤雲技術團隊]併發程式設計-(2)併發程式設計的目標程式設計
- 併發技術4:讀寫鎖
- 併發技術3:定時器定時器
- 併發技術3:管道通訊
- 高併發設計技術方案
- 基於協程的高效能高併發伺服器框架—協程模組伺服器框架
- 【併發技術04】執行緒技術之死鎖問題執行緒
- 【併發技術03】傳統執行緒互斥技術—synchronized執行緒synchronized
- 併發技術5:死鎖問題
- 【併發技術02】傳統執行緒技術中的定時器技術執行緒定時器
- Golang語言goroutine協程併發安全及鎖機制Golang
- 【Golang】淺談協程併發競爭資源問題Golang
- 2. Go併發程式設計--GMP排程Go程式設計
- Zookeeper分散式過程協同技術 - 群首選舉分散式
- Zookeeper分散式過程協同技術 - 概念及基礎分散式
- Zookeeper分散式過程協同技術 - 部署及設定分散式
- MySQL的事務機制和鎖(InnoDB引擎、MVCC多版本併發控制技術)MySqlMVC
- Java併發技術05:傳統執行緒同步通訊技術Java執行緒
- 協程必知必會-系列3-批次併發執行
- 學習之路 / goroutine 併發協程池設計及實現Go
- 【多執行緒與高併發 2】volatile 篇執行緒
- PHP 多工協程處理PHP
- 一日一技:協程與多程式的完美結合