月归档:六月 2011

twisted系列教程十六–twisted守护进程

Part 16: Twisted Daemonologie 原文:http://krondo.com/blog/?p=2345 作者:dave 译者:notedit 时间:2011.06.28 Introduction 到目前为止我们写的server 还运行在一个终端里面,通过print 语句向外输出内容.开发的时候这样做是很有好处的,但是当你部署一个产品的时候这样就不好了.一个生产环境中的server应该是: 作为一个守护进程运行,不和任何的终端和会话相连.你不会希望当你登出的时候,你的server 也会退出 把debug和错误信息输出到一个日志文件中,或者syslog 服务中 低权限的,比如,用一个低权限的用户运行 把它的pid 记到一个文件中,管理员可以很容易的向守护进程发送信号 twisted 已经提供了对上面四条的支持.但首先我们首先要先改变一下我们的代码. The Concepts 要想理解twisted 你需要学习一些新的概念.最重要的一个概念是Service,一般来说,一个新的概念往往和一个或多个接口对应. IService IService接口定义了一个可以被停止和开启的service.这个service 做什么呢? 你可以做任何你想做的,这个接口仅仅需要一些很少的参数和方法(它定义的少,你可以实现的就多),而不是定义了特定的函数的一种service. 这个接口需要两个属性:name 和 running.name属性只是一个字符串, 例如”fastpoetry”或者None,running 属性是一个布尔类型,假如这个service被成功的开启,这个值为true. 我们只会接触ISservice 的一些方法.我们会略过那些高级的不常用的方法.IService 的两个基本方法是startService 和stopService: def startService(): … 继续阅读

发表在 python, twisted | 评论关闭

twisted系列教程十五–测试twisted代码

Part 15: Tested Poetry 原文:http://krondo.com/blog/?p=2273 作者:dave 译者:notedit 时间:2011.06.27 Introduction 在这个系列中我们也已经写了很多twisted 代码了,但目前为止我们忽略了一个很重要的事情—测试.你可能也一直在想我们怎样用一个同步的测试框架unitest来测试我们的异步的程序.简短的回答是不能,我们已经发现,同步的程序和异步的程序不能混合在一起.最起码不会很好的结合在一起. 幸运的是,twisted 已经包含了他自己的异步测试测试框架–trial.我们也可以用它来测试同步的框架. 我们假设你已经对unittest 的测试原理和测试框架比较熟悉了,在unittest 中,我们通过定义一个继承TestCase的类创建测试,并且每个测试方法前面以test为前缀.框架会帮你发现测试,运行测试,然后报告出测试结果. The Example 你会在tests/test_poetry.py发现一些例子代码.为了保证我们的例子可以自包含,我们已经把全部的有必要的代码拷进test 模块.正常的来说,你只需要导入你想测试的模块就可以了. 这个例子测试了client 和server,通过使用这个client 去从test server 上获取到每一首诗.为了提供一个可供测试的server,我们在我们的测试用例中实现了setUp 方法: class PoetryTestCase(TestCase): def setUp(self): factory = PoetryServerFactory(TEST_POEM) from twisted.internet import reactor self.port = reactor.listenTCP(0, … 继续阅读

发表在 python, twisted | 评论关闭

twisted系列教程十四— pre-fireed deferred

Part 14: When a Deferred Isn’t 原文:http://krondo.com/blog/?p=2205 作者:dave 译者:notedit 时间:2011.06.27 Introduction 在这一部分我们将要学习deferred 类的另外的一个方面.为了促进讨论,我们要为我们的poetry service增加一个server.假设我们有大量的内部的client 想要连接一个相同的外部的server.假设这个server已经很慢而且已经负载很高了.我们不想再让server上连接更多的client 了. 所以我们会创建一个缓存代理服务器.当一个client 连接到proxy的时候,这个proxy或者从外部的server获取到一首诗或者就返回一个之前已经缓存了的内容.我们可以让我们的client 都连接proxy,我们的外部的server 的负载就会很小.我们可以用图片三十来描述这个过程: 思考一下当一个client连接到proxy 之后会发生什么,假如这个proxy 的缓存是不存在的,这个proxy必须异步等待外部的server 返回一个结果然后才能返回client.到目前为止还不错,我们已经知道怎样去处理返回deferred 的异步的函数.另一方面,假如在缓存中已经有了一个一首诗,这个proxy 会把它立即返回,一点也不用等待.所以proxy获取一首诗的内容可以是同步的或者是异步的. 所以 我们能做些什么假如我们有一个有时异步有时同步的函数?twisted 提供了很多选项,并且它们依据deferred 的一个我们没有讲的特色:你可以在你返回deferred之前触发它. 这个是管用的,因为尽管你不能触发一个deferred 两次,但是你可以在deferred 触发之后向deferred 中增加callbacks 和 errbacks.当你这样做的时候,deferred 会继续的触发 callback/errback 链 从上次它离开的地方.一个很重要的一点是一个已经触发的deferred … 继续阅读

发表在 python, twisted | 评论关闭

twisted系列教程十三–deferred 中的deferred

Part 13: Deferred All The Way Down 原文:http://krondo.com/blog/?p=2159 作者:dave 译者:notedit 时间:2011.06.26 Introduction 回想一下第十部分的poetry client 5.1,client 用一个deferred 来管理一个callback 链,这个callback 链中调用了一个transformation 引擎,在client 5.1 中,这个引擎是作为一个同步的函数来实现的. 现在我们想写一个新的client,让它利用我们在第十二部分写的transformation service.问题就来了:既然transformation service 是通过网络访问的,我们需要用异步的I/O.这就意味着我们用来请求transformation 的api 是异步的.也就是说我们的try_to_cummingsify callback 会返回一个Deferred 对象 在一个deferred 链中的callback 返回另一个deferred 的时候会发生什么?让我们把第一个deferred 叫做外部的deferred 第二个deferred 叫做内部的deferred.假设在外部的deferred 中callback N … 继续阅读

发表在 python, twisted | 评论关闭

twisted系列教程十二–为server 增加一个service

Part 12: A Poetry Transformation Server 原文:http://krondo.com/blog/?p=2101 作者:dave 译者:notedit 时间:2011.06.25 One More Server 在第九部分和第十部分我们介绍了关于诗歌的变形引擎的想法,最后我们实现了cummingsifier,我们还让它抛出随机的异常来模拟错误.但是假如这个变形的引擎在另外一台服务器上,提供一种网络的”poetry transformation service”, 那么现在又多出来一种出错的方式:变形引擎挂掉了. 所以在第十二部分我们将要实现一个poetry transformation server,并在下一部分,我们让我们的client 使用一个外部的transformation service,并从中学到Deferred 的一些东西. Designing the Protocol 到现在为止client 和server 端的交互都是单向的,server 端向client端发送一首诗,而client 什么也向server 发送.但是一个transformation service 是双向的– client 端向server发送一首诗然后服务端发送给client 一首变形后的诗.所以我们需要一个新的protocol来处理这种交互. 在我们实现这个的时候,我们让server 支持多种的变形方式,并让client 可以选择使用哪一种.所以client … 继续阅读

发表在 python, twisted | 评论关闭

twisted系列教程十一 — 一个twisted 的服务端

Part 11: Your Poetry is Served 原文:http://krondo.com/blog/?p=2048 作者:dave 译者:notedit 时间:2011.06.23 A Twisted Poetry Server 既然我们已经学了这么多twisted client 的编写,现在让我们来用twisted来重新实现一下我们的poetry server 吧.我们要多谢谢twisted 抽象的普遍性,貌似我们已经学了twisted 的我们需要知道的大部分东西了.看下我们的twisted poetry server twisted-server-1/fastpoetry.py,它被叫做fastpoetry 应为这个server可以尽可能快的发送一首诗.它的代码要比cilent 中的代码要少. 让我们一次分析一小段的代码,首先,PoetryProtocol: class PoetryProtocol(Protocol): def connectionMade(self): self.transport.write(self.factory.poem) self.transport.loseConnection() 就像client 一样,server 用了一个单独的protocol 实例来管理每一个不同的连接.这里的protocol 是我们server端的poetry protocol.因为我的protocol 是严格的单向的(one-way不知道怎么翻译),server … 继续阅读

发表在 twisted | 评论关闭

twisted系列教程十–可以变化的诗

Part 10: Poetry Transformed 原文:http://krondo.com/blog/?p=1956 作者:dave 译者:notedit 时间:2011.06.22 Client 5.0 现在我们将要想我们的client中加入一些变形逻辑.但是首先我不得不说:我不知道怎样写一个Byronification 引擎,它超出我的能力范围了.做为替代,我会实现一个相对简单的变形–Cummingsifier.Cummingsifier 是可以把一首诗变成令一首cumming风格的诗的算法.下面就是这个算法的实现: def cummingsify(poem) return poem.lower() 不幸的是,这个算法很简单以至于很难失败,所以在client 5.0 版本中在 twisted-client-5/get-poetry.py中,我们用了一个可以随机出现以下结果的算法: 返回一个正常的结果 抛出一个GibberishError错误 抛出一个ValueError 错误 通过这种方法我们模拟了一个有时返回异常的复杂的算法. 在client 5.0 中唯一变化的是poetry_main 函数: def poetry_main(): addresses = parse_args() from twisted.internet import reactor poems … 继续阅读

发表在 twisted | 评论关闭

twisted系列教程九–Deferred 的第二个小插曲

Part 9: A Second Interlude, Deferred 原文:http://krondo.com/blog/?p=1825 作者:dave 译者:notedit 时间:2011.06.21 More Consequence of Callbacks 我们将要再来研究一下callback,尽管我们已经对deferred比较了解而且已经可以写出twisted 风格的异步程序,Deferred 类提供了更多的特色来进行处理一些更复杂的设置.所以我们要想出一些更复杂的设置来看看用callback编程的时候能给我们造成哪些挑战.然后我们会研究deferred是怎样处理这些挑战的. 为了激发我们继续讨论,我们将会向我们的poetry client增加一个新的功能.假设某的蛋痛的科学家发明出了一个特别的算法,这个算法可以将一首诗变成另一首诗.而且我们的导师提供了一个参照的实现,用下面的接口来实现: class IByronificationEngine(Interface): def byronificate(poem): “”" Return a new poem like the original, but in the style of Lord Byron. Raises GibberishError … 继续阅读

发表在 twisted | 评论关闭

twisted系列教程八–延迟的诗

twisted 教程 继续阅读

发表在 twisted | 一条评论

twisted系列教程七–小插曲,延迟对象

twisted 教程 继续阅读

发表在 twisted | 评论关闭