假设一个goroutine正在从网络中读取。每次goroutine必须等待(被阻塞以等待网络响应)时,会发生什么?运行goroutine的OS线程是否被阻塞?还是像C#中的异步操作一样工作(线程返回线程池,直到操作系统的IO线程通知程序要处理的新数据,然后线程池中的另一个线程继续处理数据从网络上收到)?
我主要担心的是,如果Go在每次goroutine被阻塞时都保持阻塞的线程,如果我的服务器中有许多goroutine在处理来自非常慢的网络的传入连接,那么我可能最终会耗尽RAM,因为每个这些被阻塞的线程消耗大约2MB的RAM。或者,如果由Go创建的用于运行goroutine的线程池有限制,那么我可能会失去活力。
那么goroutine在IO绑定操作中如何表现?
如果是异步syscall,它将阻塞goroutine并释放线程以运行另一个goroutine,就像goroutine在例如上被阻塞一样。频道阅读。
如果是阻塞的系统调用,那么Go对此无能为力-系统调用将阻塞线程,句点。 Go可能启动另一个线程来处理由调度程序确定的可运行goroutine。