tornado源码分析(一)之事件循环IOLoop

事件驱动编程是一种网络编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。

让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

可以看出时间驱动模型对cpu的使用率是最高的,他不会因某一个任务的阻塞而导致整个进程的阻塞,总是有一个可运行的任务在执行。

tornado就是使用事件驱动模型实现的,IOLoop即为tornado的事件循环,也是tornado的核心,tornado在ioloop中循环检查三类事件:

1、可立即执行的事件(ioloop._callbacks),这类事件一般是Future在set_result是将Futrue中的所有call_back以这种类型的事件添加至ioloop,ioloop在存在这类事件时会立即调度这些事件的回掉函数。

添加可立即执行的事件的接口:ioloop.add_callback(callback)

2、timer定时器事件,ioloop中维护一个定时器事件列表(按照timeout时间,以最小堆的形式存储),在ioloop循环至定时器事件时,不断的判断堆顶的定时器是否超时,如果超时则取出,直到取出所有超时的定时器,之后会调度这些定时器对应的回掉函数。

添加定时器事件的接口:ioloop.call_at(deadline, callback)

3、io事件,在可立即执行的事件、定时器时间的回掉函数都执行完后,ioloop会检查是否有新的可立即执行的事件加入,如果有则io事件的阻塞时间设置为0即不阻塞,否则检查距离最近的一个定时器超时还有多长时间,将该时间设置为io事件的阻塞时间。

io事件的接口:ioloop.add_handler(fd, handler, events), ioloop.update_handler(fd, events), ioloop.remove_handler(fd) 

源码参考:tornado.ioloop.PollIOLoop

猜你喜欢

转载自blog.csdn.net/lxyjj/article/details/84707668
今日推荐