Twisted是httplib2/socket的替代品吗?

6 投票
2 回答
1992 浏览
提问于 2025-04-15 11:30

很多Python库,即使是最近写的,也会使用httplib2或者socket接口来进行网络操作。

这些方法显然比Twisted更容易编写,因为它们是阻塞式的,这意味着代码会在执行某个操作时停下来等结果。但我觉得这在和其他代码(特别是图形用户界面代码)结合时是个缺点。如果你想要可扩展性、并发处理或者图形界面的整合,同时又不想使用多线程,那么Twisted就是一个很自然的选择。

所以我对这些问题很感兴趣:

  1. 新的网络代码(除了小型命令行工具)是否应该使用Twisted来编写?
  2. 你会在同一个项目中混合使用Twisted、http2lib或socket代码吗?
  3. 对于大多数库来说,Twisted是否符合Python的风格(因为它比其他选择更复杂,还引入了一个非标准的依赖包...)?

编辑:让我换个方式表达。你觉得用Twisted编写新的库代码会让人更难接受吗?Twisted有明显的好处(特别是可移植性和可扩展性,正如gimel所说),但因为它不是Python的核心库,有些人可能会认为这是个缺点。

2 个回答

5

可以看看 Python Twisted中的异步编程,你需要考虑一下使用一个非标准的(外部)库是否适合你的需求。注意一下 @Glyph 的回答,他是 Twisted 项目的创始人,可以权威地回答任何与 Twisted 相关的问题。

像 Twisted 这样的库的核心功能并不是让程序“睡觉”,而是调用操作系统的一些功能,比如 select() 或 poll(),这些功能在 Python 的 select 模块中可以找到。我说“像” select,是因为这个接口在不同的平台上差别很大,几乎每个图形用户界面工具包都有自己版本的实现。Twisted 目前提供了一个抽象接口,支持14种不同的变体。这样的接口的共同点是,它能让你说:“这是我在等待的一系列事件。等其中一个发生时再唤醒我,并告诉我到底是哪个事件。”

0
  1. 新的网络代码(除了小的命令行工具)应该用Twisted来写吗?
    • 也许吧。这真的要看情况。有时候,把阻塞的调用放在自己的线程里就足够简单了。Twisted适合大规模的网络代码。
  2. 你会在同一个项目中混合使用Twisted、http2lib或socket代码吗?
    • 当然可以。不过要记住,Twisted是单线程的,任何在Twisted中阻塞的调用都会让整个引擎停下来。
  3. 对于大多数库来说,Twisted算不算“Python风格”(它比其他选择更复杂,还引入了对非标准包的依赖……)?
    • 有很多Twisted的狂热支持者会说它应该放在Python的标准库里。但其实很多人也能用asyncore/asynchat写出不错的网络代码。

撰写回答