我不认为这个测试方法不专业,因为它能说明,在这个 sleep 场景下,goroutine 内存占比确实比 java 的 virtual thread 占用高。
我觉的叫 goroutine 为协程并没有什么问题,可能翻译得不够准确,但是当你说 go 协程,别人知道你指的是 goroutine 就可以了,没有什么大问题。
不过我觉得这个测试可能并不能很好的说明问题,不管是 goroutine ,rust 的 tokio ,或者是 c#的 async/await ,它们本质上解决两个问题,一个 io 就绪回调,一个 sleep 就绪回调。但是要实现这种回调,需要在资源没就绪时候,保存现场,腾出 cpu 给其他任务运行,保存完毕后,其他任务运行,资源就绪后,就有了再次被执行的机会。这个内存消耗主要在保存现场需要的内存上。由于这些异步框架实现方式不一,不排除有些实现,检查测试代码不需要保存现场,直接定时器回调实现,从而节省内存。
一种测试方法是通过每个任务去发起一个 tcp 连接,然后服务端 hold 10s 再返回,测试内存占用可能更能说明实际的问题。
另外还有就是执行时间问题,因为如果开一个 goroutine 排队执行,内存占用肯定比开 1m goroutine 小🤣
也有可能 java 的 virtual thread 和 c# async/await 确认非常优秀,全面领先 goroutine ,希望有实力的人从新设计测试方法。
比较好奇,每个 goroutine 2kb ,到底存的是什么
最后 @
lesismal @
kneo 两位高手来围观