簡體   English   中英

當 goroutines(以及運行它們的操作系統線程)被 IO 綁定操作阻塞時,它們的行為如何?

[英]How do goroutines (and the OS threads running them) behave when they get blocked by an IO bound operation?

假設一個 goroutine 正在從網絡中讀取數據。 每次 goroutine 必須等待(被阻塞等待網絡響應),會發生什么? 運行 goroutine 的操作系統線程是否被阻塞? 還是像 C# 中的異步操作一樣工作(線程返回線程池,直到操作系統的 IO 線程通知程序有新數據要處理,然后線程池中的另一個線程繼續處理數據)從網絡收到)?

我主要擔心的是,如果 Go 每次 goroutine 被阻塞時都會保持一個阻塞線程,如果我在服務器中有許多 goroutine 處理來自非常慢的網絡的傳入連接,我可能最終會耗盡 RAM,因為每個 goroutine 都被阻塞了線程消耗大約 2MB 的 RAM。 或者如果 Go 創建的運行 goroutines 的線程池有限制,我可能最終會失去活力。

那么 goroutines 在 IO 綁定操作中是如何表現的呢?

如果它是一個異步系統調用,它會阻塞 goroutine 並釋放線程來運行另一個 goroutine,就像 goroutine 阻塞在例如通道讀取上一樣。

如果它是一個阻塞的系統調用,那么 Go 對此無能為力——系統調用將阻塞線程,周期。 Go 可能會啟動另一個線程來處理調度程序確定的可運行 goroutine。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM