non-blocking IO + IO multiplexing + one loop per thread

在“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 里即可。

取自:第三章 多线程服务器的适用场合与常用编程模型

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google photo

You are commenting using your Google account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理