微吼云上線多路互動(dòng)直播服務(wù) 加速多場景互動(dòng)直播落地
1069
2025-04-02
Go協(xié)程并發(fā)之百萬級(jí)并發(fā)「讓我們一起Golang」
前面我們介紹了關(guān)于Golang的協(xié)程并發(fā)的一些理論知識(shí),接下來我們上代碼,通過代碼帶大家了解一下Go的協(xié)程并發(fā),體驗(yàn)Go的百萬級(jí)并發(fā)。
我們先來了解一下進(jìn)程、線程、協(xié)程的區(qū)別吧!
進(jìn)程有自己獨(dú)立的堆和棧,而線程雖然擁有獨(dú)立的棧,但是它的堆是共享的。而我們這里要講的協(xié)程和線程是一樣的,也是只共享堆,而不共享?xiàng)!5菂f(xié)程不像進(jìn)程和線程那樣由操作系統(tǒng)調(diào)度,而是由程序員來調(diào)度,這樣就可以節(jié)省資源,提高性能。
下面來看看主協(xié)程和一條協(xié)程在并發(fā)執(zhí)行時(shí)的表現(xiàn)吧!
func main() { go func() { for{ fmt.Println("i am coroutine") time.Sleep(time.Second) } }() for{ fmt.Println("我是主協(xié)程") time.Sleep(time.Second) } }
他們運(yùn)行結(jié)果是:
我是主協(xié)程 i am coroutine i am coroutine 我是主協(xié)程 我是主協(xié)程 i am coroutine i am coroutine 我是主協(xié)程 i am coroutine 我是主協(xié)程
我們可以看到,他們并不是順序執(zhí)行的,而是并發(fā)執(zhí)行的,這就是協(xié)程并發(fā)。
func main() { //但是開啟100條小協(xié)程是主協(xié)程干的 //迅速開啟100條小協(xié)程 for i:=0;i<10;i++{ go doSomething("面包人"+strconv.Itoa(i)) } for{ fmt.Println("我是主協(xié)程") time.Sleep(time.Second) } } func doSomething(grname string) { for{ fmt.Println("來了一車",grname) time.Sleep(time.Second) } }
來了一車 面包人0 來了一車 面包人7 來了一車 面包人8 我是主協(xié)程 來了一車 面包人2 來了一車 面包人6 來了一車 面包人3 來了一車 面包人1 來了一車 面包人5 來了一車 面包人9 來了一車 面包人4 來了一車 面包人0 來了一車 面包人8 來了一車 面包人1 來了一車 面包人2 來了一車 面包人4 來了一車 面包人7 來了一車 面包人3 來了一車 面包人9 來了一車 面包人5 我是主協(xié)程 來了一車 面包人6 來了一車 面包人1 來了一車 面包人4
這里體驗(yàn)的是11條協(xié)程并發(fā)。是主協(xié)程喚起了十條協(xié)程,然后才有一車車面包人來打你。因此主協(xié)程是那個(gè)打電話喊面包人打你的人。也就是說主協(xié)程開啟了10條協(xié)程。但是這十一條協(xié)程是并發(fā)的,他們不是順序執(zhí)行的。雖然是并發(fā)執(zhí)行的,但是在微觀上每次還是只能執(zhí)行一條協(xié)程,但是他們的執(zhí)行順序和創(chuàng)建順序是不一致的。
然后將
for i:=0;i<10;i++{ go doSomething("面包人"+strconv.Itoa(i)) }
改為
for i:=0;i<1000000;i++{ go doSomething("面包人"+strconv.Itoa(i)) }
這就是百萬級(jí)并發(fā)了!
一個(gè)主協(xié)程可以喊100萬車面包人打你。
經(jīng)過測試,程序持續(xù)1分鐘都沒有崩潰。事實(shí)證明,執(zhí)行協(xié)程只需要消耗極少的內(nèi)存和CPU資源,所以我們可以創(chuàng)建一百萬條協(xié)程。16G內(nèi)存的電腦,用JAVA,C來做并發(fā),差不多也就千級(jí)并發(fā),而用GO語言,通過管道可以讓并發(fā)能力得到很大提升,我們這里實(shí)現(xiàn)了百萬級(jí)并發(fā)。
goroutine是協(xié)作式調(diào)度的,而Java等的使用的線程是搶占式調(diào)度的。
Go 任務(wù)調(diào)度
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。