暫停當(dāng)前goroutine,使其他goroutine先行運(yùn)算。只是暫停,不是掛起,當(dāng)時(shí)間片輪轉(zhuǎn)到該協(xié)程時(shí),Gosched()后面的操作將自動恢復(fù)
創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供金安網(wǎng)站建設(shè)、金安做網(wǎng)站、金安網(wǎng)站設(shè)計(jì)、金安網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、金安企業(yè)網(wǎng)站模板建站服務(wù),10年金安做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
package main
import (
"fmt"
)
func main() {
go output("goroutine 2")
output("goroutine 1")
}
func output(s string){
for i:=0;i<3;i++{
fmt.Println(s)
}
}
goroutine 1
goroutine 1
goroutine 1
結(jié)論:還沒等到子協(xié)程執(zhí)行,主協(xié)程就已經(jīng)執(zhí)行完退出了,子協(xié)程將不再執(zhí)行,所以打印的全部是主協(xié)程的數(shù)據(jù)。當(dāng)然,實(shí)際上這個(gè)執(zhí)行結(jié)果也是不確定的,只是大概率出現(xiàn)以上輸出,因?yàn)橹鲄f(xié)程和子協(xié)程間并沒有絕對的順序關(guān)系
package main
import (
"fmt"
"runtime"
)
func main() {
go output("goroutine 2")
runtime.Gosched()
output("goroutine 1")
}
func output(s string){
for i:=0;i<3;i++{
fmt.Println(s)
}
}
goroutine 2
goroutine 2
goroutine 2
goroutine 1
goroutine 1
goroutine 1
結(jié)論:在打印goroutine 1之前,主協(xié)程調(diào)用了runtime.Gosched()方法,暫停了主協(xié)程。子協(xié)程獲得了調(diào)度,從而先行打印了goroutine 2。主協(xié)程不是一定要等其他協(xié)程執(zhí)行完才會繼續(xù)執(zhí)行,而是一定時(shí)間。如果這個(gè)時(shí)間內(nèi)其他協(xié)程沒有執(zhí)行完,那么主協(xié)程將繼續(xù)執(zhí)行,例如以下例子
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func() {
time.Sleep(5000)
output("goroutine 2")
}()
runtime.Gosched()
output("goroutine 1")
}
func output(s string) {
for i := 0; i < 3; i++ {
fmt.Println(s)
}
}
goroutine 1
goroutine 1
goroutine 1
立即終止當(dāng)前協(xié)程,不會影響其它協(xié)程,且終止前會調(diào)用此協(xié)程聲明的defer方法。由于Goexit不是panic,所以recover捕獲的error會為nil
當(dāng)main方法所在主協(xié)程調(diào)用Goexit時(shí),Goexit不會return,所以主協(xié)程將繼續(xù)等待子協(xié)程執(zhí)行,當(dāng)所有子協(xié)程執(zhí)行完時(shí),程序報(bào)錯(cuò)deadlock
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
go func(){
defer func(){
fmt.Println("defer func executed!")
fmt.Println("recovered error == ",recover())
}()
for i:=0;i<3;i++{
if i==1{
runtime.Goexit()
}
fmt.Println(i)
}
}()
time.Sleep(2*time.Second)
}
0
defer func executed!
recovered error == <nil>
設(shè)置可同時(shí)執(zhí)行的邏輯Cpu數(shù)量,默認(rèn)和硬件的線程數(shù)一致而不是核心數(shù),可以通過調(diào)用GOMAXPROCS(-1)來獲取當(dāng)前邏輯Cpu數(shù)
最好在main函數(shù)之前設(shè)置它,GOMAXPROCS同時(shí)也是go的環(huán)境變量之一
? 當(dāng)n<1:非法數(shù)字,方法不作修改
? 當(dāng)n==1:單核心,多協(xié)程并發(fā)執(zhí)行,并發(fā)只是看起來是同時(shí)執(zhí)行的,實(shí)際上是同一時(shí)刻只有一個(gè)協(xié)程在跑,只是由于cpu的任務(wù)調(diào)度算法,讓多個(gè)協(xié)程在效果上同時(shí)執(zhí)行
? 當(dāng)n>1:多核心,多協(xié)程并行執(zhí)行,并行一定是并發(fā),不同的核心同時(shí)地跑不同的協(xié)程
想要了解更多有關(guān)并發(fā)(Concurrency)和并行(Parallel)的區(qū)別,可以看看大神Rob Pike的視頻Concurrency Is Not Parallelism,里面有很詳細(xì)的講解
作者:胡金生
出處:www.aprilboy.com
版權(quán)所有,歡迎保留原文鏈接進(jìn)行轉(zhuǎn)載:)
網(wǎng)站名稱:淺析runtime包中的三個(gè)方法Gosched、Goexit、GOMAXPROCS
路徑分享:http://jinyejixie.com/article20/psipco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、關(guān)鍵詞優(yōu)化、網(wǎng)站排名、面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)