goroutines(以及运行它们的OS线程)在受到IO绑定操作阻塞时如何工作?

问题描述 投票:-3回答:1

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

我主要担心的是,如果Go在每次goroutine被阻塞时都保持阻塞的线程,如果我的服务器中有许多goroutine在处理来自非常慢的网络的传入连接,那么我可能最终会耗尽RAM,因为每个这些被阻塞的线程消耗大约2MB的RAM。或者,如果由Go创建的用于运行goroutine的线程池有限制,那么我可能会失去活力。

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

multithreading go concurrency goroutine
1个回答
0
投票

如果是异步syscall,它将阻塞goroutine并释放线程以运行另一个goroutine,就像goroutine在例如上被阻塞一样。频道阅读。

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

© www.soinside.com 2019 - 2024. All rights reserved.