接下来的计划
我将在这里简要列出我们需要做的事情:
需要两个事件队列
- 我们需要一个线程池来执行 CPU 密集型任务或我们想要异步运行但不在 OS 支持的事件队列中的任务
- 我们需要编写一个简单的跨平台
epoll/kqueue/IOCP
事件循环。 事实证明这非常有趣,但它也有很多代码,所以我把这部分分成一个单独的“配套书”1, 供那些想要进一步探索的人使用。在这里我们使用名为minimio
的库。
当然,我们违反了不使用任何依赖项的规则,但这是我们自己的依赖项, 我将在适当的时候对这些进行全面解释。
需要一个运行时
我们编写的运行时会:
- 存储稍后运行的回调
- 发送要在线程池上执行的任务
- 向操作系统注册感兴趣的事件(通过
minimio
) - 轮询我们的两个事件源以获取新事件
- 处理计时器 (timer)
- 为诸如
Fs
和Crypto
之类的“模块”提供一种注册任务的方法 - 推进所有的任务直到完成它们
需要一些模块
- 用于处理文件系统任务
Fs
- 用于处理 http 调用
HTTP
- 用于处理加密任务
Crypto
需要一些辅助函数
我们需要一些助手来使我们的代码可读并提供我们想要看到的输出。 与任何真实的运行时相比,我们有兴趣知道发生了什么以及何时发生。 为了帮助解决这个问题,我们定义了三个额外的方法:
print
:打印出一条消息,首先告诉我们消息是从哪个线程输出的,然后是我们提供的消息。print_content
:与print
的作用相同,但它让我们以一种不错的方式打印出更多消息。current
:获取当前线程名称的快捷方式。 因为我们想要跟踪正在发生的事情,所以我们需要打印出哪个线程正在发出什么输出, 这样可以避免在此过程中过多地混淆我们的代码。
Minimio
minimio 是一个基于 epoll/kqueue/IOCP 的跨平台事件循环,我们将在下一本书中介绍。 本书最初包含这部分,但结果证明为三种架构实现它比我最初想象的要复杂一些,并且需要比本书更多的空间。
当 epoll/kqueue/IOCP 的知识集中于另一本书1中时,它也更容易阅读。
1