3个版本
0.1.2 | 2022年3月4日 |
---|---|
0.1.1 | 2022年3月3日 |
0.1.0 | 2022年3月3日 |
#958 in 异步
27KB
534 行
tl-async-runtime
一个大约600行逻辑的简单运行时示例
功能
- 单线程异步
- 多线程异步
- 定时器支持
- 基本IO(目前仅TCP)
错误
很多。
架构
通过调用block_on
函数并传入一个future,首先创建运行时。运行时将启动线程并在运行时上启动给定的future。
此时,所有线程都是'工作者'。
- 线程执行一些基本的账务任务(稍后详述)。
- 从运行时请求一个就绪任务
- 如果它能获取一个任务,它将对其进行一次轮询
- 如果它不能获取任务,它将'停放'线程
- 重复
主线程额外执行一步,即轮询由初始启动返回的通道future。这样我们就可以在任务完成时立即退出。
账务
异步运行时的核心是调度任务和管理线程。
这只有两个步骤
- 循环遍历已过时的定时器并将它们放入就绪状态
- 轮询操作系统的事件并分派它们
定时器
定时器非常基础。当定时器第一次被轮询时,它获取线程本地的执行器对象并将一个(Time, TaskId)
对推入一个优先队列(按时间升序排列)。
账务员将循环遍历这个优先队列并将相应的任务ID发送到就绪队列。
操作系统事件
使用mio,在创建时将事件源注册到操作系统。
当请求特定源的事件时,一个[RegistrationToken -> Sender]
条目被推入一个散列表。
账务员将轮询操作系统以获取新事件。如果在散列表中找到了相应的令牌,它将通过通道发送事件。由于它使用一个未来感知通道,它将自动唤醒任何等待事件的任务
依赖关系
~5–15MB
~169K SLoC