作为 Windows 用户,我知道 OS 线程会消耗 ~1 Mb 的内存,因为如果 OS 线程更加贪吃的话,每个线程By default, Windows allocates 1 MB of memory for each thread’s user-mode stack.如何golang使用 ~8kb 的内存goroutine。是goroutine虚拟线程吗?
2 回答
慕码人8056858
TA贡献1803条经验 获得超6个赞
Goroutines 不是线程,它们是(来自规范):
...在同一地址空间内的独立并发控制线程或goroutine。
Effective Go将它们定义为:
它们之所以被称为goroutine,是因为现有的术语——线程、协程、进程等——传达了不准确的内涵。goroutine 有一个简单的模型:它是一个与同一地址空间中的其他 goroutine 并发执行的函数。它是轻量级的,成本比分配堆栈空间多一点。并且堆栈开始时很小,因此它们很便宜,并且可以通过根据需要分配(和释放)堆存储来增长。
Goroutines 没有自己的线程。相反,多个 goroutines(可能)被复用到同一个 OS 线程上,所以如果一个 goroutines 应该阻塞(例如等待 I/O 或阻塞通道操作),其他 goroutines 继续运行。
同时执行 goroutine 的实际线程数可以通过该runtime.GOMAXPROCS()
函数设置。从runtime
包文档中引用:
GOMAXPROCS 变量限制了可以同时执行用户级 Go 代码的操作系统线程的数量。代表Go代码在系统调用中可以阻塞的线程数没有限制;这些不计入 GOMAXPROCS 限制。
请注意,在当前的实现中,默认情况下只有 1 个线程用于执行 goroutine。
- 2 回答
- 0 关注
- 172 浏览
添加回答
举报
0/150
提交
取消