##language:zh [[self:解读_PyTwisted|返回目录]] -------------- ''' Twisted服务器开发技巧(1) - 将性能优化到底 ''' = Twisted服务器开发技巧(1) - 将性能优化到底 = Twisted是一个非常具有想像力的框架。我已经被它的代码所折服,我想在我下面再使用python开发网络应用时,可能只会选用Twisted了。但是,一个真正达到性能优化服务器,还是需要我们在程序中真正良好的去应用Twisted的各种工具的。 最常见的情况就是我们将一个非阻塞的应用中,加入了长时间的处理过程,从而达到了阻塞的效果,从而让大家都因为一位同志的长时工作而等待。 先来看看下面的这段代码: {{{ #!python from twisted.internet import protocol, reactor from twisted.protocols import basic class FingerProtocol(basic.LineReceiver): def lineReceived(self, user): self.transport.write(self.factory.getUser(user)+"\r\n") self.transport.loseConnection() class FingerFactory(protocol.ServerFactory): protocol = FingerProtocol def __init__(self, **kwargs): self.users = kwargs def getUser(self, user): return self.users.get(user, "No such user") reactor.listenTCP(1079, FingerFactory(hd='Hello my python world')) reactor.run() }}} 它可能是我们所写的第一个Twisted服务器。可能所有人都会认为这样的操作已经不会有什么问题了。但是显然,在这里我们的getUser更多的情况下可能会是从数据库中或是LDAP服务器上获取相关的信息。哪么最好的处理就是将get操作以非即时方式返回,以避免发生处理的阻塞。哪么就需要使用Deferreds了: {{{ #!python from twisted.internet import protocol, reactor, defer from twisted.protocols import basic class FingerProtocol(basic.LineReceiver): def lineReceived(self, user): self.factory.getUser(user ).addErrback(lambda _: "Internal error in server" ).addCallback(lambda m: (self.transport.write(m+"\r\n"), self.transport.loseConnection())) class FingerFactory(protocol.ServerFactory): protocol = FingerProtocol def __init__(self, **kwargs): self.users = kwargs def getUser(self, user): return defer.succeed(self.users.get(user, "No such user")) reactor.listenTCP(1079, FingerFactory(hd='Hello my python world')) reactor.run() }}} 这里getUser返回的是defer处理过的一个事务,而addCallback方法注册了defer中处理完成后的返回事件。这样,事务的处理就可以在另一个事件可调度的情况下进行了。从而避免了因一个用户的处理阻塞的情况下,让所有的用户都停止了响应。 ---------------------- [[self:解读_PyTwisted|返回目录]]