協(xié)程并發(fā)
與傳統(tǒng)的系統(tǒng)級(jí)線程和進(jìn)程相比,協(xié)程最大的優(yōu)勢(shì)在于“輕量級(jí)”??梢暂p松創(chuàng)建上萬(wàn)個(gè)而不會(huì)導(dǎo)致系統(tǒng)資源衰竭。
一個(gè)線程中可以有任意多個(gè)協(xié)程,但某一時(shí)刻只能有一個(gè)協(xié)程在運(yùn)行,多個(gè)協(xié)程分享該線程分配到的計(jì)算資源。
多數(shù)語(yǔ)言在語(yǔ)法層面不直接支持協(xié)程,而是通過(guò)庫(kù)的方式支持,但用庫(kù)的方式支持的功能也并不完整,比如僅僅提供協(xié)程的創(chuàng)建、銷毀與切換等能力。如果在這樣的輕量級(jí)線程中調(diào)用一個(gè)同步IO操作,比如網(wǎng)絡(luò)通信、本地文件讀寫,都會(huì)阻塞其他的并發(fā)執(zhí)行輕量級(jí)線程,從而無(wú)法真正達(dá)到輕量級(jí)線程本身期望達(dá)到的目標(biāo)。
Go并發(fā)
Go在語(yǔ)言級(jí)別支持協(xié)程,叫g(shù)oroutine。Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)提供的所有系統(tǒng)調(diào)用操作(包括所有同步IO操作),都會(huì)出讓CPU給其他goroutine。折讓輕量級(jí)線程的切換管理不依賴于系統(tǒng)的線程和進(jìn)程,也不需要依賴于CPU的核心數(shù)量。
有人把Go比作21世界的C語(yǔ)言。第一是因?yàn)镚o語(yǔ)言設(shè)計(jì)簡(jiǎn)單,第二,21世紀(jì)最重要的就是并行程序設(shè)計(jì),而Go從語(yǔ)言層面就支持并發(fā)。同時(shí),并發(fā)程序的內(nèi)存管理有時(shí)候是非常復(fù)雜的,而Go語(yǔ)言提供了自動(dòng)垃圾回收機(jī)制。
Go語(yǔ)言中的并發(fā)程序主要使用兩種手段來(lái)實(shí)現(xiàn)。goroutine和channel。
什么是goroutine
Goroutine是Go語(yǔ)言并行設(shè)計(jì)的核心,有人稱之為go程。Goroutine從量級(jí)上看很像協(xié)程,它比線程更小,十幾個(gè)goroutine可能體現(xiàn)在底層就是五六個(gè)線程,Go語(yǔ)言內(nèi)部幫你實(shí)現(xiàn)了這些goroutine之間的內(nèi)存共享。執(zhí)行g(shù)oroutine只需極少的棧內(nèi)存(大概是4~5KB),當(dāng)然會(huì)根據(jù)相應(yīng)的數(shù)據(jù)伸縮。也正因?yàn)槿绱?,可同時(shí)運(yùn)行成千上萬(wàn)個(gè)并發(fā)任務(wù)。goroutine比thread更易用、更高效、更輕便。
一般情況下,一個(gè)普通計(jì)算機(jī)跑幾十個(gè)線程就有點(diǎn)負(fù)載過(guò)大了,但是同樣的機(jī)器卻可以輕松地讓成百上千個(gè)goroutine進(jìn)行資源競(jìng)爭(zhēng)。