Go有一个调度程序,可让您编写同步代码,并自行进行上下文切换,并在后台使用异步IO。因此,如果您正在运行多个goroutine,则它们可能在单个系统线程上运行,并且当您的代码在goroutine的视图中被阻止时,它实际上并没有被阻止。这不是魔术,但是的,它掩盖了所有这些东西。
调度程序将在需要它们时以及在确实阻塞的操作期间分配系统线程(例如,我认为文件IO正在阻塞或正在调用C代码)。但是,如果您正在做一些简单的http服务器,则实际上可以使用少量“真实线程”来获得成千上万的goroutine。
您可以在此处详细了解Go的内部工作原理:
https://morsmachine.dk/go-scheduler



