回答

收藏

goroutine 是如何工作的?(或:goroutines 和 OS 线程的关系)

技术问答 技术问答 206 人阅读 | 0 人回复 | 2023-09-12

其他 goroutine 调用系统调用时如何继续执行?(使用 GOMAXPROCS=1 时); N: G9 L; j5 c
据我所知,在调用系统调用时,线程放弃控制,直到系统调用返回。Go 如何不为每个系统调用阻塞 goroutine 在创建系统线程时实现这种并发性?
2 A* [" S8 L. I3 i" z2 [' u从文档:
# p2 X& H2 g; L/ S7 w  Z协程, M: E% m6 b" Z3 T/ [1 ?5 w* |* B
它们叫 goroutines 是因为现有的术语-线程、协程、过程等。goroutine 有一个简单的模型:它是与同一地址空间中的其他 goroutine 并发执行函数。它是轻量级的,成本比分配堆栈空间多一点。而且堆栈一开始很小,所以很便宜,可以根据需要分配(和释放)存储来增长。
) R+ }8 C2 |; r; `4 b5 W, AGoroutines 多路复用 OS 线程,所以如果一个应该被阻塞,比如等待 I/O ,其他人继续运行。它们的设计隐藏了许多线程创建和管理的复杂性。
. e9 z& L0 I6 _: g+ O1 G
                                                               
+ v0 P9 F9 I, l( J3 `4 H! A    解决方案:                                                                9 \6 ?0 w3 t1 u7 P  S+ z9 O
                                                                如果一个 goroutine 堵塞,运行时启动新的  OS 线程处理其他 goroutine,直到阻塞停止阻塞。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则