Twisted的魅力何在?
我越来越多地听到人们说Python的Twisted框架非常棒,而其他框架相比起来就显得逊色了。
有没有人能解释一下这个情况,并且可能把Twisted和其他网络编程框架做个对比?
2 个回答
这可能主要是个人喜好问题。
Twisted 是一个很棒的工具,它可以让你轻松创建基于事件的网络服务器和客户端,你不需要太担心实现这些功能的复杂细节。而且由于它采用了 MIT 许可证,所以几乎可以在任何地方使用 Twisted。不过我没有进行过性能测试,所以不太清楚它的扩展能力,但我猜应该还不错。
另一个优点是 Twisted 项目,通过这些项目,你可以快速了解如何实现你想要的大多数服务器或服务。
Twisted 还有很棒的 文档,我几周前刚开始使用它时,很快就能做出一个可用的原型。
我对 Python 还很陌生,如果我说错了,请指正我。
Twisted有很多不同的功能,可能会让你觉得很酷。
Twisted包含了很多协议的实现,这意味着你很可能会找到一个可以用来与远程系统(通常是客户端或服务器)沟通的API。无论是HTTP、FTP、SMTP、POP3、IMAP4、DNS、IRC、MSN、OSCAR、XMPP/Jabber、telnet、SSH、SSL、NNTP,还是一些非常冷门的协议,比如Finger或ident,或者一些更底层的协议构建协议,比如DJB的netstrings、简单的行协议,甚至是Twisted的自定义协议,比如Perspective Broker (PB)或Asynchronous Messaging Protocol (AMP)。
Twisted的另一个酷点是,在这些低级协议实现的基础上,通常会有一些更容易使用的抽象。例如,在编写HTTP服务器时,Twisted Web提供了一种“资源”抽象,让你可以用Python对象构建URL层次结构,从而定义如何响应请求。
所有这些功能都是通过合作的API连接在一起的,主要是因为这些功能并不是通过在网络上阻塞来实现的,所以你不需要为每个操作启动一个线程。这使得Twisted在处理大量连接时表现得很出色(虽然这种扩展性只涉及单台计算机,而不是让你的应用程序扩展到整个集群的那种扩展性),因为Twisted可以在一个线程中处理成千上万的连接,这通常比为每个连接启动成千上万的线程要好。
避免使用线程对测试和调试(因此也提高了可靠性)也很有好处。由于在典型的Twisted程序中没有抢占式上下文切换,你通常不需要担心锁的问题。依赖于不同网络事件发生顺序的竞争条件可以通过模拟这些网络事件轻松进行单元测试(而模拟上下文切换并不是大多数(任何?)线程库提供的功能)。
Twisted也非常注重质量。所以你在Twisted的发布版本中很少会发现回归问题,大多数API都能正常工作,即使你不是以常见的方式使用它们(因为我们会测试你可能使用它们的所有方式,而不仅仅是常见的方式)。这对于过去3到4年中添加(或修改)的所有代码尤其如此,因为自那时以来,100%的代码覆盖率已成为最低测试要求。
另一个常被忽视的Twisted优势是它十年来对不同平台特性的理解。不同平台上有很多未记录的套接字错误,了解它们的存在非常困难,更不用说如何处理它们了。Twisted逐渐覆盖了越来越多的这些错误,现在处理得相当不错。年轻的项目没有这样的经验,因此会错过一些可能只会发生在你发布的项目用户身上的冷门失败模式。
总的来说,我觉得Twisted最酷的地方在于,它是一个相对简单的库,让我可以忽略很多无聊的问题,专注于有趣和好玩的事情。:)