rust 的异步为什么要把网络库重新写一遍？为什么rust tokio写异步程序需要引入额外的库，比如网络io要tokio::net
而golang的goroutine可以直接用标准库，而不用区分哪些package是同步的或是异步的？
go 的异步是有栈协程，无传染性，任意函数调用里都可以切换控制权。底层网络库可以选择切换，也可以选择阻塞，不一定需要提供两套 API。

go runtime 本身就是异步运行时，标准库自然都是异步的。

rust 的异步是无栈协程，有传染性，只有在await 点才能切换控制权。必须整个应用都异步化，才能最大程度发挥异步的优势。所以形成了一套异步生态系统。

rust 有实现有栈协程的能力，但由于原子性和安全性的冲突、空间利用率、堆分配等问题，最后胜出的是无栈协程。

异步化通常会牺牲延迟指标，在需要极端低延迟的场景中，同步可能是个更好的选择。同步还有更易于使用的优势。因此另一套同步生态也有存在的价值。

此外，不同异步模型 (reactor/proactor, work-stealing/thread-per-core) 也会造成分裂。

总结主要原因：

1. go 有栈协程与 rust 无栈协程的区别。

2. go 本身就是异步运行时，而 rust 可以更换不同的异步运行时。

3. 采用不同模型的库适用于不同场景，都有存在价值。