让我们假设一个 goroutine 正在从网络中读取数据。每次 goroutine 必须等待(被阻塞等待网络响应)时,会发生什么?运行 goroutine 的操作系统线程是否被阻塞?还是它像 C# 中的异步操作一样工作(线程返回线程池,直到操作系统的 IO 线程通知程序有新数据要处理,然后,线程池中的另一个线程继续处理数据从网络接收)?
我主要担心的是,如果 Go 每次 goroutine 被阻塞时都保持一个阻塞线程,如果我在服务器中有许多 goroutine 处理来自非常慢的网络的传入连接,我最终可能会耗尽 RAM,因为每个被阻塞线程消耗大约 2MB 的 RAM。或者如果 Go 创建的运行 goroutines 的线程池有限制,我可能最终会耗尽活力。
那么 goroutine 在 IO 绑定操作中是如何表现的呢?
12345678_0001
相关分类