先来了解一下几个重要的概念:
Future
这是Rust异步的核心,但是也是定义最简短的, 官方对它的定义是一个可能还没有完成的计算值,有了它,线程可以在等待它计算完成的同时去做其他的事情。它的表现形式就是一个只有一个方法的trait, 这个方法叫poll,根本目的是为了向调用者报告自己的状态, 状态就两种Ready和Pending, 前者说明已经计算完成了, 后者是说别着急,还在算着。其实在我看来,这定义还是有些抽象, 把Future说成是一个任务我觉得更为贴切, 这个任务有以下两个特点(自己总结的, 不保证准确,欢迎补充) :
1. 完备性。任务在生成的时候就包含了所有与任务本身有关的要素,所以它可以作为一个整体在线程之间进行迁移, 也就是说活已经安排的妥妥当当了, 就差执行任务的人了,也就是线程。而且我这个任务不挑嘴, 完成一半中途换人也是可以接受的。
2. 有状态。任务不像常规的函数或者方法,对它的调用不是阻塞的, 也就是说调用者不必一直等到任务的最终结果为止, 控制权可以中途从任务返回到调用者, 然后在适当的时候再回到任务中, 而且所返回的位置都是有记录的,再次进入任务的时候不必从头开始, 而是直接回到上次返回的那个位置继续剩余的工作。这里需要注意的是中途返回的时候是没法稍带返回值给调用者的, 返回的状态只能是Pending, 借以告诉调用者我的工作还没有完成,请晚些时候再来。只有最终完成的时候才可以把最终结果以Ready(Val)的形式返回出去。所以我们完全可以把任务看成是一个只有两种状态的有限状态机。
Reactor
这个概念是最模糊的,查了一些资料,最终也没找到一个合适的具像的解释。有的就直接把它定义为一个资源(resource),