*事件库

*为什么需要事件库?

让我们通过一系列问答来搞清楚。

问:你希望网络服务器一直在做什么?
答:监听其端口上的入站连接并接受它们。

问:调用 accept 会产生一个描述符。我该怎么处理它?
答:保存描述符,并对其执行非阻塞读/写操作。

问:为什么读/写必须是非阻塞的?
答:如果文件操作(即使在 Unix 中套接字也是文件)是阻塞的,当服务器阻塞在文件 I/O 操作中的时候,它怎么可能接受其他连接请求呢。

问:我猜我必须在套接字上做很多这样的非阻塞操作来查看它何时就绪。我说得对吗?
答:是的。这就是事件库为你做的事情。现在你明白了。

问:事件库是如何做到它们所做的事情的?
答:它们使用操作系统的 轮询 机制以及定时器。

问:那么有没有任何开源事件库做你刚才描述的事情?
答:有。libeventlibev 是我能立刻想起来的两个事件库。

问:Redis 是否使用这样的开源事件库来处理套接字 I/O?
答:不。由于各种 原因,Redis 使用自己的事件库。