1 回答

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊
不,它不會(huì)阻塞。我粗略的(并且沒有來(lái)源,我是通過 osmosis 得到的)理解是,每當(dāng)一個(gè) goroutine 想要執(zhí)行一個(gè)具有等效非阻塞版本的“阻塞”I/O 時(shí),
改為執(zhí)行非阻塞版本。
將它自己的 ID 記錄在一個(gè)由它“阻塞”的句柄鍵入的表中。
將完成的責(zé)任轉(zhuǎn)移到一個(gè)專用線程,該線程位于
select
循環(huán)中(或poll
任何可用的等效線程)等待此類操作解除阻塞,并且掛起自身,釋放其操作系統(tǒng)線程(M)以運(yùn)行另一個(gè) goroutine。
當(dāng) I/O 操作解除阻塞時(shí),選擇循環(huán)在表中查找哪個(gè) goroutine 對(duì)結(jié)果感興趣,并安排它運(yùn)行。這樣,等待 I/O 的 goroutine 就不會(huì)占用一個(gè) OS 線程。
在無(wú)法以非阻塞方式完成的 I/O 或任何其他阻塞系統(tǒng)調(diào)用的情況下,goroutine 通過將其線程標(biāo)記為阻塞的運(yùn)行時(shí)函數(shù)執(zhí)行系統(tǒng)調(diào)用,并且運(yùn)行時(shí)將為 goroutines 創(chuàng)建一個(gè)新的 OS 線程以被安排在。這保持了讓 GOMAXPROCS 運(yùn)行(未阻塞)goroutines 的能力。對(duì)于大多數(shù)程序來(lái)說(shuō),這不會(huì)導(dǎo)致太多的線程膨脹,因?yàn)橛糜谔幚砦募⑻捉幼值鹊淖畛R姷南到y(tǒng)調(diào)用已經(jīng)變得異步友好。(感謝@JimB 提醒我這一點(diǎn),以及有用的鏈接答案的作者。)
- 1 回答
- 0 關(guān)注
- 141 瀏覽
添加回答
舉報(bào)