Go語言入門13之runtime包案例講解
Runtime包
GOMAXPROCS()
? 用來設(shè)置可以并行計算的CPU核數(shù)最大值,并返回之前的值,具體使用方法上一篇有些,這里不再贅述
Gosched()
? 用于讓出CPU時間片,讓出當(dāng)前goroutine的執(zhí)行權(quán)限,調(diào)度器安排其他等待的任務(wù)運行,并在下次某個時候從該位置恢復(fù)執(zhí)行
Goexit()
? 用于立即中止當(dāng)前goroutine的運行(中止所在協(xié)程),而并不影響其他goroutine。?注意!Goexit()在中止當(dāng)前協(xié)程前,還是會運行當(dāng)前goroutine還沒有執(zhí)行的defer語句,切記,不允許在主函數(shù)調(diào)用Goexit(),會導(dǎo)致panic異常
runtime調(diào)度器是非常有用的東西,關(guān)于runtime包幾個方法:
Gosched:讓當(dāng)前線程讓出cpu以讓其他線程運行,它不會掛起當(dāng)前線程,因此當(dāng)前線程未來會繼續(xù)執(zhí)行
NumCPU:返回當(dāng)前系統(tǒng)的CPU核數(shù)量
GOMAXPROCS:設(shè)置最大的可同時使用的CPU核數(shù)
Goexit:退出當(dāng)前goroutine(但是defer語句會照常執(zhí)行)
NumGoroutine:返回真該執(zhí)行和排隊的任務(wù)總數(shù)
GOOS:目標(biāo)操作系統(tǒng)
- GOROOT:返回本機(jī)的GO路徑
舉個栗子
// 定義兩個函數(shù),Test01和Test02 // Test02在Test01運行結(jié)束之后運行 // 并且Test02在i = 3的時候結(jié)束運行 //Test01 func Test01(wg *sync.WaitGroup) { defer func() { fmt.Println("Test01結(jié)束!") wg.Done() }() fmt.Println("協(xié)程01循環(huán)輸出:") for i := 0; i < 5; i++ { fmt.Println("協(xié)程01 -", i) } } // Test02 func Test02(wg *sync.WaitGroup) { defer func() { fmt.Println("Test02結(jié)束!") wg.Done() }() // 等待Test01運行結(jié)束 runtime.Gosched() fmt.Println("協(xié)程02循環(huán)輸出:") for i := 0; i < 5; i++ { if i == 3 { fmt.Println("i = 3 退出!") // 當(dāng)i = 3時執(zhí)行defer里的語句然后退出 runtime.Goexit() } fmt.Println("協(xié)程02 -", i) } } // main函數(shù)調(diào)用 func main() { var wg sync.WaitGroup wg.Add(2) go Test01(&wg) go Test02(&wg) wg.Wait() fmt.Println("This is main function!") } /*輸出: 協(xié)程01循環(huán)輸出: 協(xié)程01 - 0 協(xié)程01 - 1 協(xié)程01 - 2 協(xié)程01 - 3 協(xié)程01 - 4 Test01結(jié)束! 協(xié)程02循環(huán)輸出: 協(xié)程02 - 0 協(xié)程02 - 1 協(xié)程02 - 2 i = 3 退出! Test02結(jié)束! This is main function! */
到此這篇關(guān)于Go語言入門13(runtime包)的文章就介紹到這了,更多相關(guān)Go runtime包內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IdeaGo啟動報錯Failed to create JVM的問題解析
這篇文章主要介紹了IdeaGo啟動報錯Failed to create JVM的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11詳解Go語言微服務(wù)開發(fā)框架之Go chassis
分布式系統(tǒng)中每個進(jìn)程的動態(tài)配置管理及運行時熱加載就成為了一個亟待解決的問題。go chassis汲取了netflix的archaius框架經(jīng)驗,并做出來自己的創(chuàng)新特性。2021-05-05Go語言使用kafka-go實現(xiàn)Kafka消費消息
本篇文章主要介紹了使用kafka-go庫消費Kafka消息,包含F(xiàn)etchMessage和ReadMessage的區(qū)別和適用場景,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的可以了解一下2024-12-12使用Go語言構(gòu)建高效的二叉搜索樹聯(lián)系簿
樹是一種重要的數(shù)據(jù)結(jié)構(gòu),而二叉搜索樹(BST)則是樹的一種常見形式,在本文中,我們將學(xué)習(xí)如何構(gòu)建一個高效的二叉搜索樹聯(lián)系簿,感興趣的可以了解下2024-01-01詳解golang channel有無緩沖區(qū)的區(qū)別
這篇文章主要給大家介紹了golang channel有無緩沖區(qū)的區(qū)別,無緩沖是同步的,有緩沖是異步的,文中通過代碼示例給大家講解的非常詳細(xì),需要的朋友可以參考下2024-01-01go語言實現(xiàn)簡單的并發(fā)網(wǎng)頁爬蟲示例
在這個章節(jié)中,我們將會結(jié)合之前的知識點,實現(xiàn)一個簡易的并發(fā)網(wǎng)頁爬蟲,我們的爬蟲會先爬取一個起始頁面,提取出所有的鏈接,然后并發(fā)地爬取這些鏈接,有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-08-08