xuxingzhuang 2012-05-29
Twisted对网络应用开发者来说是一个平台。Python语言本身就很强大,但它缺少很多其他语言都在极力添加的功能。现在好了,Twisted是一款很好的(稍微特别的)纯Python框架或库,这取决于你如何看待它,并且它不断的在完善。
1. 如果做一件事情是有顺序的,先做完Task1,再做Task2,最后做Task3,这类事情也是我们日常见的最多的一种情况,如下图所示:
2. 如果做一件事情并没有顺序之分,可以同时进行,每一件事情也是相对独立的,其实这就是一种同步模型。当然,其实这也是一种理想情况,在大多数情况下,进程之间或线程之间往往要进行通信,一个任务会等待另外一个任务的返回结果,这就有些较为复杂了,如下图所示:
3. 在异步模型中,任务是交替运行的,但仍然在一个进程中,其中每个任务的运行状态都是可以被我们控制的,如下图所示:
异步模型与同步模型有什么区别吗?
a) 同步模型中的任务交替运行,是需要多个线程协同完成的,受到程序的控制,而在异步模型中则不需要。
b) 多线程本身就受到操作系统的调度与管理,所以同步模型本身就受到操作系统控制的,而在异步模型中一个任务会一直运行下去,直到任务被运行完或者程序暂停这个任务而去执行令一个任务。
异步模型有什么特点,为什么要深入了解并学习呢?
异步模型比同步模型简单,因为异步模型只有一个进程而且任务的停止和运行状态是可控的。而在同步模型中,我们需要把每一个任务分成很多步骤,然后再有序的把他们组合起来。如果一个任务用到了令一个任务的结果,这个任务需要接受另一个任务的输出做为他自己的输入,而且这种接收的数据经常是一段一段的而不是一个整体。
异步模型与同步模型都是一个线程的话,他们执行相同的任务应该花费相同的时间,甚至比同步模型花费的时间更多,为什么要才采用异步的模型呢?
如果程序中会有阻塞、被强迫等待等情况,异步模型会比同步模型运行速度快,同步模型在有阻塞的时候的执行过程如下图所示:
图中灰色的部分代表阻塞(等待),其中阻塞的原因很多时候是由于I/O操作,这样的一个同步程序被称为“阻塞程序”。异步程序设计的原理就是当其中一个任务被阻塞的时候,可以先去执行一些其他可以执行的任务所以一个异步程序也会被叫做“无阻塞程序”。
那什么时候,我们需要考虑使用异步模型呢?
a) 有很多任务,经常总有一个任务可以继续执行
b) 这些任务中要执行很多I/O操作
c) 这些任务大多都是独立的
这些优势,非常适合一个非常繁忙的Web Server,每一个任务代表了一次接收请求和发送结果,而这些Client 请求大多都是独立的,所以一个Web Server的实现一个很好的异步模型的实现,这就是Twisted被叫做网络编程库的原因。