#run-time #async #timer #threaded #bad #educational #impl

tl-async-runtime

仅用于教育目的的糟糕运行时实现

3个版本

0.1.2 2022年3月4日
0.1.1 2022年3月3日
0.1.0 2022年3月3日

#958 in 异步

MIT 许可证

27KB
534

tl-async-runtime

一个大约600行逻辑的简单运行时示例

功能

  • 单线程异步
  • 多线程异步
  • 定时器支持
  • 基本IO(目前仅TCP)

错误

很多。

架构

通过调用block_on函数并传入一个future,首先创建运行时。运行时将启动线程并在运行时上启动给定的future。

此时,所有线程都是'工作者'。

  1. 线程执行一些基本的账务任务(稍后详述)。
  2. 从运行时请求一个就绪任务
    • 如果它能获取一个任务,它将对其进行一次轮询
    • 如果它不能获取任务,它将'停放'线程
  3. 重复

主线程额外执行一步,即轮询由初始启动返回的通道future。这样我们就可以在任务完成时立即退出。

账务

异步运行时的核心是调度任务和管理线程。

这只有两个步骤

  1. 循环遍历已过时的定时器并将它们放入就绪状态
  2. 轮询操作系统的事件并分派它们

定时器

定时器非常基础。当定时器第一次被轮询时,它获取线程本地的执行器对象并将一个(Time, TaskId)对推入一个优先队列(按时间升序排列)。

账务员将循环遍历这个优先队列并将相应的任务ID发送到就绪队列。

操作系统事件

使用mio,在创建时将事件源注册到操作系统。

当请求特定源的事件时,一个[RegistrationToken -> Sender]条目被推入一个散列表。

账务员将轮询操作系统以获取新事件。如果在散列表中找到了相应的令牌,它将通过通道发送事件。由于它使用一个未来感知通道,它将自动唤醒任何等待事件的任务

依赖关系

~5–15MB
~169K SLoC