在“non-blocking IO + IO multiplexing”这种模型中,程序的基本结构是一个事件循环(event loop),以事件驱动(event-driven)和事件回调的方式实现业务逻辑:
// 代码仅为示意,没有完整考虑各种情况
while (!done)
{
int timeout_ms = max(1000, getNextTimedCallback());
int retval = ::poll(fds, nfds, timeout_ms);
if (retval < 0) {
// 处理错误,回调用户的 error handler
} else {
// 处理到期的 timers,回调用户的 timer handler
if (retval > 0) {
// 处理 IO 事件,回调用户的 IO event handler
}
}
}
上述这种模型(Reactor 模式)是单线程服务器的常用编程模型,优点明显,效率不错,但事件回调函数必须是非阻塞的,否则整个线程阻塞影响了其他事件消息的处理。
基于此,多线程的服务器编程模型就可以演变成 one loop per thread,每个线程都有一个事件循环。Event loop 代表了线程的主循环,需要让哪个线程干活,就把 timer 或 IO channel (如 TCP 连接)注册到哪个线程的 loop 里即可。
取自:第三章 多线程服务器的适用场合与常用编程模型