goroutines(以及 OS 线程 运行 它们)在被 IO 绑定操作阻塞时如何表现?

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

让我们假设一个 goroutine 正在从网络读取。每次 goroutine 必须等待(被阻塞等待网络响应),会发生什么? OS 线程 运行 是否阻塞了 goroutine?或者它是否像 C# 中的异步操作一样工作(其中线程 returns 到线程池,直到操作系统的 IO 线程通知程序有新数据要处理,然后,线程池中的另一个线程继续处理从网络接收到的数据)?

我主要担心的是,如果 Go 在每次 goroutine 被阻塞时都保留一个阻塞的线程,如果我在服务器中有很多 goroutine 处理来自非常慢的网络的传入连接,我可能会 运行ning RAM 不足,因为每个被阻塞的线程都消耗大约 2MB 的 RAM。或者如果Go to 运行 goroutines创建的线程池有限制,我可能会运行宁死

那么 goroutines 在 IO 绑定操作中表现如何?

如果它是一个异步系统调用,它会阻塞 goroutine 并将线程释放到 运行 另一个 goroutine,就好像 goroutine 正在阻塞一样。频道阅读。

如果它是阻塞系统调用,Go 对此无能为力 - 系统调用将阻塞线程,句号。 Go 可能会启动另一个线程来处理 运行 由调度程序确定的可用 goroutine。