繁体   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