libuv basics

查看原文

libuv 的基本原理是维护一个持续运行的事件循环,当收到 I/O 通知的时候,运行与该 I/O 有关的回调函数。对于网络 I/O 由于有跨平台的的 aio 接口,所以可以直接在事件循环内调度。对于文件 I/O, 没有跨平台的 I/O 接口,所以替代方案是起一个线程池,将 I/O 操作提到另外的线程去执行,保证 I/O 操作不会影响当前线程(这需要额外分配 cpu 资源用于线程切换)。

事件循环的限制是:

  • 回调函数如果包含 Blocking I/O 那么整个事件循环都会被堵塞
  • CPU 密集运算不适合放在事件循环进程里运行,否则也会影响事件调度。

libuv 中的几个重要概念:

  • request: 代表一个只会执行一个回调的任务。
  • handle: 代表一个将会长时间运行的任务。
  • callback: 回调函数,被用在 request, handle 中等事件来了就运行的一个函数。

如果有需要存储什么上下文数据,handle 和 request 里面都有 void* data 字段可以给你挂引用。