讓我們假設(shè)一個(gè) goroutine 正在從網(wǎng)絡(luò)中讀取數(shù)據(jù)。每次 goroutine 必須等待(被阻塞等待網(wǎng)絡(luò)響應(yīng))時(shí),會(huì)發(fā)生什么?運(yùn)行 goroutine 的操作系統(tǒng)線程是否被阻塞?還是它像 C# 中的異步操作一樣工作(線程返回線程池,直到操作系統(tǒng)的 IO 線程通知程序有新數(shù)據(jù)要處理,然后,線程池中的另一個(gè)線程繼續(xù)處理數(shù)據(jù)從網(wǎng)絡(luò)接收)?我主要擔(dān)心的是,如果 Go 每次 goroutine 被阻塞時(shí)都保持一個(gè)阻塞線程,如果我在服務(wù)器中有許多 goroutine 處理來自非常慢的網(wǎng)絡(luò)的傳入連接,我最終可能會(huì)耗盡 RAM,因?yàn)槊總€(gè)被阻塞線程消耗大約 2MB 的 RAM?;蛘呷绻?Go 創(chuàng)建的運(yùn)行 goroutines 的線程池有限制,我可能最終會(huì)耗盡活力。那么 goroutine 在 IO 綁定操作中是如何表現(xiàn)的呢?
1 回答

12345678_0001
TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果它是一個(gè)異步系統(tǒng)調(diào)用,它會(huì)阻塞 goroutine 并釋放線程以運(yùn)行另一個(gè) goroutine,就像 goroutine 阻塞例如通道讀取一樣。
如果它是一個(gè)阻塞的系統(tǒng)調(diào)用,那么 Go 對此無能為力 - 系統(tǒng)調(diào)用將阻塞線程,期間。Go 可能會(huì)啟動(dòng)另一個(gè)線程來處理由調(diào)度程序確定的可運(yùn)行的 goroutine。
- 1 回答
- 0 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)
0/150
提交
取消