rust徒手编写模拟tokio异步运行时
能够使用一种语言徒手编写线程池或者异步运行时,可以代表你对语言语法的和语义的理解已经达到一定的高度了,证明你在不熟悉任何三方框架的情况下,对语言本身的已经达到融会贯通的程度了。
用rust语言写线程池的代码很简单,但是要写一个性能可以媲美tokio的异步运行时的话,还是需要一些思考的。
- tokio有一个可以在任何地方都可以运行的spawn函数。所以需要造一个全局运行时MiniTokioRuntime。
- tokio的spawn函数返回一个JoinHandle可以获得异步运行结果,它内部使用的是raw指针转换。我们尝试一种新的方法,使用一种通用的类型AsyncResult。
- 运行时需要两个管道。一个用来输送spawn的执行结果。另一个用来输送唤醒的任务。
- tokio有任务窃取机制,我们为了简化任务窃取机制,使用crossbeam_channel可以简化任务窃取部分的开发。如果后续希望任务窃取部分性能更好,可以后续自行编写。但眼下使用crossbeam_channel的性能已经可以比肩tokio了。
- tokio是有多线程版本和单线程版本的。我们为了学习,所以只做多线程版本。
- tokio的多线程版本的core线程数量是固定的,虽然有函数spawn_blocking可以在线程全部都繁忙的情况下,临时创建线程来执行async fn。这块我们是为了学习tokio的主要运行逻辑,所以这块我们不再做。
- tokio有很多自定义继承了Future的类,我们为了学习只做一个Sleep即可。
- 异步运行时肯定要使用很多很多的锁,为了性能更好,我们选择使用parking_lot。