python Select\Poll\Epoll异步IO与事件驱动

参考:http://www.cnblogs.com/alex3714/articles/5248247.htmlhtml

写服务器处理模型的程序时一般采用的模型:程序员

(1)每收到一个请求,建立一个新的进程,来处理该请求;特色:因为建立新的进程的开销比较大,因此,会致使服务器性能比较差,但实现比较简单。
(2)每收到一个请求,建立一个新的线程,来处理该请求;特色:要涉及到线程的同步,有可能会面临 死锁等问题。
(3)每收到一个请求,放入一个事件列表,让主进程经过非阻塞I/O方式来处理请求。特色:写应用程序代码时,逻辑比前面两种都复杂。
上面的几种方式,各有千秋,通常广泛认为第(3)种方式是大多数 网络服务器采用的方式。

事件驱动模型

事件驱动模型大致思路以下:
1. 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增长一个点击事件(消息);
3. 有个循环,不断从队列取出事件,根据不一样的事件,调用不一样的函数,如onClick()、onKeyDown()等;
4. 事件(消息)通常都各自保存各自的处理函数指针,这样,每一个消息都有独立的处理函数;编程

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

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

在单线程同步模型中,任务按照顺序执行。若是某个任务由于I/O而阻塞,其余全部的任务都必须等待,直到它完成以后它们才能依次执行。网络

在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操做系统来管理,在多处理器系统上能够并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其余线程得以继续执行。与完成相似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,由于这类程序不得不经过线程同步机制如锁、可重入函数、线程局部存储或者其余机制来处理线程安全问题,若是实现不当就会致使出现微妙且使人痛不欲生的bug。多线程

在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其余昂贵的操做时,注册一个回调到事件循环中,而后当I/O操做完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询全部的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽量的得以执行而不须要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,由于程序员不须要关心线程安全问题。函数

IO多路复用:性能

参考http://www.cnblogs.com/alex3714/articles/5876749.html操作系统

http://www.cnblogs.com/alex3714/articles/5248247.html

相关文章
相关标签/搜索