事件驱动编程是一种网络编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。
让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有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循环至定时器事件时,不断的判断堆顶的定时器是否超时,如果超时