multithreading - goroutines(以及运行它们的操作系统线程)在被 IO 绑定(bind)操作阻塞时如何表现?

标签 multithreading go concurrency goroutine

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

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

那么 goroutine 在 IO 绑定(bind)操作中是如何表现的呢?

最佳答案

如果它是一个异步系统调用,它会阻塞 goroutine 并释放线程以运行另一个 goroutine,就像 goroutine 阻塞一样。一个 channel 读取。

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

关于multithreading - goroutines(以及运行它们的操作系统线程)在被 IO 绑定(bind)操作阻塞时如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59722707/

相关文章:

go - go 中的 sleep 和 select 行为

go - 为什么在对象上使用 new() 不会包含在 Go 的内存分析文件中?

java - 为什么我的多线程 Java 程序没有最大化我机器上的所有内核?

c++ - 非原子变量的障碍和同步点 - 数据竞争?

sql-server - 如何在共享数据库上同时生成唯一的用户名?

java - mysql中如何使用多线程取数据

每个线程使用不同设置的 Python 多线程

debugging - Goland 无法在 macos 上运行调试

c# - asp.net mvc批处理(外部线程)挂起,也许超时?

c# - 将 db 对象发送到新线程的类