Goroutines vs Java Threads
本文谈论了为何在一台机器上可以有百万个 Goroutines 而只能有千量级的 Threads.
- Threads 的运行需要两个东西:指令 pc 用来表示运行到了代码的哪里,以及 stack 用来维护局部变量和到堆上的指针变量。所有 Threasd 共享一个 Heap。
- 几乎所有的 JVM 实现都依赖 OS threads 来实现语言的 Thread。所以操作系统能搞出的上限,Java 只会少不会多。
- 假设 JVM per thread 能用 1MB stack,那 1GB 内存只能产生 1k Threads。
- Go 使用 Dynamically Sized Stacks。每个 stack 只消耗 4kb,所以 1GB 可以产生 250 万个 goroutines。
- 同时,JVM 需要依赖 OS 调度 Threads,大约 1 核 CPU 能运行 100k threads 一秒,这还是理论上限。
- Go 单次切换不像 Java 那样要到 us 级别,只需要 100 nanoseconds 就能切换好。
- ^ 同理,Java 系的 Akka 框架使用类似技术,也能做到百万 Actors。