3 回答

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊
是什么讓您認(rèn)為Go使用用戶空間線程?
沒有。它使用OS線程,并且可以利用多個(gè)內(nèi)核。
您可能會對以下事實(shí)感到困惑:默認(rèn)情況下,Go僅使用1個(gè)線程來運(yùn)行您的程序。如果啟動兩個(gè)goroutine,它們將在一個(gè)線程中運(yùn)行。但是,如果一個(gè)I / O的goroutine塊創(chuàng)建了第二個(gè)線程,并繼續(xù)在新線程上運(yùn)行另一個(gè)goroutine。
如果您確實(shí)想解鎖全部的多核功能,請使用該GOMAXPROCS()
功能。
runtime.GOMAXPROCS(4); //somewhere in main
現(xiàn)在,您的程序?qū)⑹褂?個(gè)OS線程(而不是1個(gè)),并且將能夠完全使用例如4個(gè)核心系統(tǒng)。

TA貢獻(xiàn)1779條經(jīng)驗(yàn) 獲得超6個(gè)贊
我假設(shè)“用戶空間線程”是指(例如)Go的goroutine。
的確,使用goroutines進(jìn)行并發(fā)要比設(shè)計(jì)(通過手工和科學(xué)計(jì)算)為OS線程分配工作單元的專用算法效率低。
但是:每個(gè)Go程序都位于一個(gè)環(huán)境中,旨在解決特定問題。可以為環(huán)境對Go程序提出的每個(gè)請求啟動一個(gè)新的goroutine。如果環(huán)境正在向Go程序發(fā)出并發(fā)請求,則即使Go程序僅使用1個(gè)OS線程,使用goroutines的Go程序也可能比串行程序運(yùn)行得更快。goroutine能夠以更高的速度處理請求的原因(即使僅使用1個(gè)OS線程)是因?yàn)?,?dāng)與A關(guān)聯(lián)的環(huán)境部分暫時(shí)無法執(zhí)行時(shí),Go程序會自動從goroutine A切換到goroutineB?;貞?yīng)。
但是,是的,的確,使用goroutine并將它們自動分配給多個(gè)OS線程確實(shí)比設(shè)計(jì)(通過手工和科學(xué)計(jì)算)為OS線程分配工作單元的專用算法效率低。
- 3 回答
- 0 關(guān)注
- 251 瀏覽
添加回答
舉報(bào)