Python使用Twisted总结
本篇文章来源于 Linux公社网站() 原文链接:
最近一直想把Python的Twisted框架好好学习学习,但苦于在生产环境中没有实际的应用,参考网上关于Twisted系列教程,决定深入学习下。Twisted起源于一款游戏,并在游戏中用于商业活动中,我个人也希望它能给用户带来Entertaining的交互的用户体验。
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被叫做网络编程库的原因。
本篇文章来源于 Linux公社网站() 原文链接:
这个标题容易让人产生疑惑,至少我在看Twsited系列教程的时候,第一眼看见确认让人费劲,不过相信你把这篇文章读完就明白是什么含义了。
希望读者具有一定的socket基础,如果没有接触过,请参考socket document
-
手册。你也可以在public git repository下载源代码参考,或是使用git或其他的版本管理软件clone出一份代码,如下:
1.git clone git://github.com/jdavisp3/twisted-intro.git 如果你比较怕麻烦,可以在LinuxIDC.com进行下载,下载地址:
免费下载地址在
用户名与密码都是
具体下载目录在 /2012年资料/5月/26日/Python使用Twisted总结/
下载完之后,twisted-info中有一个slow server的demo,大家可以用如下方式运行下,看下效果——缓慢的诗。
1.[root@localhost twisted-intro]# python blocking-server/slowpoetry.py --num-bytes 50 --delay 5 --port 51296 poetry/ecstasy.txt 2. 3.[root@localhost twisted-intro]# nc localhost 51296 如果一切正常的话,你会看到一条小诗被每次输出一些字节,一旦这首小诗被完全生产出来,服务器会断开连接。
除此之外,你可以尝试再打开一个新的Client去连接Server,新打开的Client必须等待第一个Client被处理完才会接收信息,的确是一首缓慢的诗^_^
在上面的例子中,客户端是阻塞的,现在我们分别运行三个不同任务的客户端,去连接三个不同的服务器,看下效果,如下:
1.[root@localhost twisted-intro]# python blocking-server/slowpoetry.py --port 10000 poetry/ecstasy.txt --num-bytes 30 2.Serving poetry/ecstasy.txt on port 10000. 3. 4.[root@localhost twisted-intro]# python blocking-server/slowpoetry.py --port 10001 poetry/fascination.txt 5.Serving poetry/fascination.txt on port 10001. 6. 7.[root@localhost twisted-intro]# python blocking-server/slowpoetry.py --port 10002 poetry/science.txt 8.Serving poetry/science.txt on port 10002. 9. 10.[root@localhost twisted-intro]# python blocking-client/get-poetry.py 10000 10001 10002 11.Task 1: get poetry from: 127.0.0.1:10000 12.Task 1: got 3003 bytes of poetry from 127.0.0.1:10000 in 0:00:10.122140 13.Task 2: get poetry from: 127.0.0.1:10001 14.Task 2: got 615 bytes of poetry from 127.0.0.1:10001 in 0:00:06.212043 15.Task 3: get poetry from: 127.0.0.1:10002 16.Task 3: got 653 bytes of poetry from 127.0.0.1:10002 in 0:00:06.613744 17.Got 3 poems in 0:00:22.947927 注意观察,以上任务是一个一个顺序运行的,至于产生阻塞的原因也很简单,主要在for循环遍历的时候,是一个任务一个任务顺序遍历的。
1.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 2.Task 2: got 10 bytes of poetry from 127.0.0.1:10001 3.Task 3: got 10 bytes of poetry from 127.0.0.1:10002 4.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 5.Task 2: got 10 bytes of poetry from 127.0.0.1:10001 6.Task 3: got 10 bytes of poetry from 127.0.0.1:10002 7.…… 8.Task 2 finished 9.Task 3: got 10 bytes of poetry from 127.0.0.1:10002 10.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 11.Task 3: got 10 bytes of poetry from 127.0.0.1:10002 12.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 13.…… 14.Task 3 finished 15.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 16.Task 1: got 30 bytes of poetry from 127.0.0.1:10000 17.…… 18.Task 1 finished 19.Task 1: 3003 bytes of poetry 20.Task 2: 615 bytes of poetry 21.Task 3: 653 bytes of poetry 22.Got 3 poems in 0:00:10.118896 注意这次任务执行的顺序,是交替的。从时间的角度来讲,异步的时间比同步的时间快很多。虽然异步的客户端也存在I/O阻塞情况,但通过交替执行可以减少阻塞时间,从而加快运行时间。
本篇文章来源于 Linux公社网站() 原文链接:
本篇文章来源于 Linux公社网站() 原文链接:
阅读(829) | 评论(0) | 转发(0) |