Python Twisted 学习系列11(转载stulife最棒的Twisted入门教程)

第十一部分:改进诗歌下载服务器

作者:[email protected]http://krondo.com/?p=2048译者:杨晓伟(采用意译)

第十一部分:改进诗歌下载服务器

你可以从这里从头阅读这个系列。

诗歌下载服务器

到目前为止,我们已经学习了大量关于诗歌下载客户端的Twisted的知识,接下来,我们使用Twisted重新实现我们的服务器端。利益于Twisted的抽象机制,接下来你会发现我们前面已经几乎全部学习到这部分知识了。其实现源码在twisted-server-1/fastpoetry.py。之所以称其为fastpoetry是因为其并没有任何延迟的传输诗歌。注意到,其代码量比客户端少多了。

让我们一部分一部分地来看服务端的实现,首先是poetryProtocol:

class PoetryProtocol(Protocol):

def connectionMade(self):

self.transport.write(self.factory.poem)

self.transport.loseConnection()

如同客户端的实现,服务器端使用Protocol来管理连接(在这里,连接是由客户端发起的)。这里的Protocol实现了我们的诗歌下载逻辑的服务器端。由于我们协议逻辑处理的是单向的,服务器端的Protocol只负责发送数据。如果你访问服务器端,协议请求服务器在连接建立后立即发送诗歌,因此我实现了connectionMade方法,其会在Protocol中创建一个连接时被激活执行。

这个方法告诉Transport做两件事:将整首诗歌发送出去然后关闭连接。当然,这两个动作都是同步操作。因此调用write函数也可以说成“一定要将整首诗歌发送到客户端”,调用loseConnection意味着“一旦将要求下载的诗歌发送完毕就关掉这个连接”。

也许你看到了,Protocol是从Factory中获得诗歌内容的:

class PoetryFactory(ServerFactory):

protocol = PoetryProtocol

def __init__(self, poem):

self.poem = poem

这么简单!除了创建PoetryProtocol工厂的仅有的工作是存储要发送的诗歌。

注意到我们继承了ServerFactory而不是ClientFactory。这是因为服务器是要被动地监听连接状态而不是像客户端一样去主动的创建。我们何以如此肯定呢?因为我们使用了listenTCP方法,其描述文档声明factory参数必须是ServerFactory类型的。

我们在main函数中调用了listenTCP函数:

def main():

options, poetry_file = parse_args()

poem = open(poetry_file).read()

factory = PoetryFactory(poem)

from twisted.internet import reactor

port = reactor.listenTCP(options.port or 0, factory,nterface=options.iface)

print ‘Serving %s on %s.‘ % (poetry_file, port.getHost())

reactor.run()

其做了三件事:

1.读取我们要发呈现的诗歌

2.创建PoetryFactory并传入这首诗歌

3.使用listenTCP来让Twisted监听指定的端口,并使用我们提供的factory来为每个连接创建一个protocol

剩下的工作就是reactor来运转事件循环了。你可以使用前面任何一个客户端来测试这个服务器。

讨论

回忆下第五部分中的图8与图9.这两张图说明了一个协议在Twisted创建一个连接后如何创建一个协议并初始化它的。其实对于Twisted在其监听的端口处接听到一个连接之后的整个处理机制也是如此。这也是为什么connectTCP与listenTCP都需要一个factory参数的原因。

我们在图9中没有展示是的,connectionMake其实也是Protocol初始化的一部分。无论在哪儿都一样(Dave是想说,connectionMade都会在Protocol初始化时执行),但我们在客户端处没有用到这个方法。并且我们在客户端的协议实现中的方法并没有在服务器处用到。因此,如果我们有这个需要,可以创建一个共享式的单一PoetryProtocol供客户端与服务器端使用。这各方式在Twisted经常见到。例如,NetstringReceiver protocol即能读从一个连接中读也能向一个连接中写netstrings。

我们略去了写从低层来实现服务器端的内容,但我们仍要来思考一下下面发生的事情。首先,调用listenTCP来告诉Twisted创建一个 listening socket 并将其添加到事件循环中。在 listening socket 有事件发生并不意味有数据要读,而是说明有客户端在等待连接自己。

Twisted会自动接受连接请求,并创建一个新客户端式连接来连接客户端与服务器(中间桥梁)。这个新的连接也要加入事件循环中,并且Twisted为其创建了一个Transport与一个专门为这个连接服务的PoetryProtocol。因此,Protocol实例总是连接到客户端式的socket,而不是监听式socket。

我们可以在图26中形象地看到这一结果:

图26:服务器端的网络连接

在图中,有三个客户端连接到服务器。每个Transport代表一个client socket,加上listening socket总共是四个被select循环监听的文件描述符(file descriptor).当一个客户端断开与其相关的transport的连接时,对应的PoetryProtocol也会被解引用并当作垃圾被回收。而PoetryFactory只要我们还在监听新的连接就会一直不停地工作(即PoetryFactory不会将PoetryProtocol会随着一个连接的断开而被销毁)。

如果我们提供的诗歌很短的话,那么这些client socket与其相关的各种对象的生命期也就很短。但也有可能会是一台相当繁忙的服务器以至于同时有千百个客户端同时请求较长的诗歌。那没关系,因为Twisted并没有连接建立的限制。当然,当下载量持续的增加,在某个结点处,你会发现已经到达了OS的上限。对于那些高下载量的服务器,仔细的检测与测试是每天都必须的工作。

并且Twisted在监听端口的数量上亦无限制。实际上,一个单一的Twisted线程可以监听数个端口并为其提供不同的服务(通过使用不同的factory作为listenTCP的参数即可)。并且经过精心的设计,使用一个Twisted线程来提供多个服务还是使用多个Twisted线程来实现可以推迟到部署阶段来做决定。

我们这个版本的服务器有些功能是没有的。首先,它无法产生任何日志来帮助我们调试和分析网络出现的问题。另外,服务器也不是做为一个守护进程来运行,很容易通过ctrl+c来中止其执行。我们将会在第十二部分来分析这部分内容。

时间: 2024-10-06 00:45:26

Python Twisted 学习系列11(转载stulife最棒的Twisted入门教程)的相关文章

Python Twisted 学习系列3(转载stulife最棒的Twisted入门教程)

第三部分:初步认识Twisted 作者:[email protected]http://krondo.com/?p=1333译者:杨晓伟(采用意译) 第三部分:开始认识Twisted 可以从这里从头开始阅读这个系列. 用twisted的方式实现前面的内容 最终我们将使用twisted的方式来重新实现我们前面的异步模式客户端.不过,首先我们先稍微写点简单的twisted程序来认识一下twisted. 最最简单的twisted程序就是下面的代码,其在twisted-intro目录中的basic-tw

Python Twisted 学习系列1(转载stulife最棒的Twisted入门教程)

第一部分:Twisted理论基础 作者:[email protected]http://krondo.com/?p=1209译者:杨晓伟(采用意译) 前言: 最近有人在Twisted邮件列表中提出诸如”为任务紧急的人提供一份Twisted介绍”的的需求.值得提前透露的是,这个序列并不会如他们所愿.尤其是介绍Twisted框架和基于Python 的异步编程而言,可能短时间无法讲清楚.因此,如果你时间紧急,这恐怕不是你想找的资料. 我相信如果对异步编程模型一无所知,快速的介绍同样无法让你对其有所理解

Python Twisted 学习系列4(转载stulife最棒的Twisted入门教程)

第四部分:由Twisted支持的诗歌客户端 作者:[email protected]://krondo.com/?p=1445译者:杨晓伟(采用意译) 第四部分:由Twisted支持的诗歌客户端 你可以在这里从头开始阅读这个系列. 第一个twisted支持的诗歌服务器 尽管Twisted大多数情况下用来写服务器代码,为了一开始尽量从简单处着手,我们首先从简单的客户端讲起. 让我们来试试使用Twisted的客户端.源码在twisted-client-1/get-poetry.py.首先像前面一样要

Python Twisted 学习系列20(转载stulife最棒的Twisted入门教程)

第二十部分 轮子中的轮子: Twisted和Erlang 简介 在这个系列中,有一个事实我们还没有介绍,即混合同步的"普通Python"代码与异步Twisted代码不是一个简单的任务,因为在Twisted程序中阻滞不定时间将使异步模型的优势丧失殆尽. 如果你是初次接触异步编程,那么你得到的知识看起来有一些局限.你可以在Twisted框架内使用这些新技术,而不是在更广阔的一般Python代 码世界中.同时,当用Twisted工作时,你仅仅局限于那些专门为作为Twisted程序一部分所写的

Python Twisted 学习系列19(转载stulife最棒的Twisted入门教程)

第十九部分 改变之前的想法 简介 Twisted是一个正在进展的项目,它的开发者会定期添加新的特性并且扩展旧的特性. 随着Twisted 10.1.0发布,开发者向 Deferred 类添加了一个新的特性—— cancellation ——这正是我们今天要研究的. 异步编程将请求和响应解耦了,如此又带来一个新的可能性:在请求结果和返回结果之间,你可能决定不再需要这个结果了.考虑一下 :doc:`p14` 中的诗歌代理服务器.下面是这个如何工作的,至少对于诗歌的第一次请求: 一个对诗歌的请求来了.

Python Twisted 学习系列22(转载stulife最棒的Twisted入门教程)

第二十二部分 结束 全部完成 呼呼! 感谢你一路支持. 在我开始时完全没有想到这个系列会这样长,会花这么多时间完成,但是创建这个系列的过程使我非常享受,也希望你喜欢它. 既然我已经完成了,我会进一步考虑将其转化为PDF格式.然而,不保证. 最后,我想总结一些帮助你继续学习Twisted的建议. 进一步阅读 首先,我建议阅读Twisted的 在线文档. 虽然它备受指责,但我觉得这总比饱受赞誉要好. 如果你希望使用Twisted进行网络编程, 那么 Jean-Paul Calderone 的广受关注

Python Twisted 学习系列6(转载stulife最棒的Twisted入门教程)

第六部分:抽象地利用Twisted 作者:[email protected]http://krondo.com/?p=1595译者:杨晓伟(采用意译) 第六部分:抽象地利用Twisted 你可以从这里从头开始阅读这个系列. 打造可以复用的诗歌下载客户端 我们在实现客户端上已经花了大量的工作.最新版本的(2.0)客户端使用了Transports,Protocols和Protocol Factories,即整个Twisted的网络框架.但仍有大的改进空间.2.0版本的客户端只能在命令行里下载诗歌.这

Python Twisted 学习系列5(转载stulife最棒的Twisted入门教程)

第五部分:由Twisted支持的诗歌客户端 作者:[email protected] http://krondo.com/?p=1522译者:杨晓伟(采用意译) 第五部分:由Twited支持的诗歌下载服务客户端 你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中,我们构建了第一个使用Twisted的客户端.它确实能很好地工作,但仍有提高的空间. 首先是,这个客户端竟然有创建网络端口并接收端口处的数据这样枯燥的代码.Twisted理应为我们实现这些例程性功能,省得我们每次写一个新的程

Python Twisted 学习系列8(转载stulife最棒的Twisted入门教程)

第八部分:使用Deferred的诗歌下载客户端 作者:[email protected]http://krondo.com/?p=1778译者:杨晓伟(采用意译) 第八部分:使用Deferred的诗歌下载客户端 可以从这里从头开始阅读这个系列. 客户端4.0 我们已经对deferreds有些理解了,现在我们可以使用它重写我们的客户端.你可以在twisted-client-4/get-poetry.py中看到它的实现. 这里的get_poetry已经再也不需要callback与errback参数了