🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[构建工具-setup.py](构建工具-setup.py.md) [TOC] ## 1. 事件驱动 通常,我们写服务器处理模型的程序时,有以下几种模型: > 1. 每收到一个请求,创建一个新的进程,来处理该请求; > 2. 每收到一个请求,创建一个新的线程,来处理该请求; > 3. 每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 几种方式,各有千秋 > 第1中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。 > 第2种方式,由于要涉及到线程的同步,有可能会面临死锁等问题。 > 第3种方式,在写应用程序代码时,逻辑比前面两种都复杂。 综合考虑各方面因素,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定(触发)。单线程中所有动作由相应的事件触发。 **1. 异步程序背后的最主要的特点就在于,当出现一个任务像在同步程序一样出现阻塞时,会让其它可以执行的任务继续执行,而 不会像同步程序中那样全部阻塞掉。因此一个异步程序只有在没有任务可执行时才会出现“阻塞”,这也是为什么异步程序被称为非阻塞程序的原因。** **2. 任务之间的切换要不是此任务完成,要不就是它被阻塞。由于大量任务可能会被阻塞,异步程序等待的时间少于同步程序而将这些时间用于其它实时工作的处理(如与人打交道的接口),这样一来,前者的性能必然要高很多。** 事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。 让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。下图展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。 ![](https://box.kancloud.cn/91a019765fb74250aab13abbf5f09f42_1162x1108.png) 注:空白表示程序处于等待(CPU) > 1. 在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。 > 2. 在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。 > 3. 在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。 当我们面对如下的环境时,事件驱动模型通常是一个好的选择: 1. 程序中有许多任务,而且… 2. 任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且… 3. 在等待事件到来时,某些任务会阻塞。 当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。 网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。 ## 2. what's the Twisted? > Twisted是用Python实现的基于事件驱动的异步网络引擎框架。基于Twisted使用和开发完全异步的网络应用程序和协议. > wisted诞生于2000年初,在当时的网络游戏开发者看来,无论他们使用哪种语言,手中都鲜有可兼顾扩展性及跨平台的网络库。Twisted的作者试图在当时现有的环境下开发游戏,这一步走的非常艰难,他们迫切地需要一个可扩展性高、基于事件驱动、跨平台的网络开发框架,为此他们决定自己实现一个,并从那些之前的游戏和网络应用程序的开发者中学习,汲取他们的经验教训。 > Twisted支持许多常见的传输及应用层协议,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一样,Twisted也具有“内置电池”(batteries-included)的特点。Twisted对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令行的工具,使得配置和部署产品级的Twisted应用变得非常方便。 > 1. twisted是实现了Reactor模式的 > 2. 在一个回调函数执行过程中,实际上Twisted的循环是被有效地阻塞在我们的代码上的。因此,因此我们应该确保回调函数不要浪费时间(尽快返回)。