许多 python 库,甚至是最近编写的库,都使用 httplib2 或套接字接口来执行网络任务。

由于它们的阻塞性质,它们显然比 Twisted 更容易编码,但我认为在将它们与其他代码(尤其是 GUI 代码)集成时这是一个缺点。如果您想要可扩展性、并发性或 GUI 集成,同时避免多线程,那么 Twisted 是一个自然的选择。

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

  1. 新的网络代码(小型命令行工具除外)是否应该使用 Twisted 编写?
  2. 您会在同一个项目中混合使用 Twisted、http2lib 或套接字代码吗?
  3. Twisted 对于大多数库来说都是 Python 风格的(它比替代方案更复杂,引入对非标准包的依赖...)?

编辑: 请让我用另一种方式表达这一点。您是否认为使用 Twisted 编写新的库代码可能会为其采用增加障碍?Twisted 具有明显的优点(特别是 gimel 所说的可移植性和可扩展性),但它不是核心 Python 库这一事实可能被一些人认为是一个缺点。

有帮助吗?

解决方案

  1. 新的网络代码(小型命令行工具除外)是否应该使用 Twisted 编写?
    • 或许。这确实取决于。有时,将阻塞调用包装在自己的线程中就足够容易了。Twisted 适用于大规模网络代码。
  2. 您会在同一个项目中混合使用 Twisted、http2lib 或套接字代码吗?
    • 当然。但请记住,Twisted 是单线程的,Twisted 中的任何阻塞调用都会阻塞整个引擎。
  3. Twisted 对于大多数库来说都是 Python 风格的(它比替代方案更复杂,引入对非标准包的依赖...)?
    • 有许多 Twisted 狂热者会说它属于 Python 标准库。但很多人可以使用 asyncore/asynchat 实现不错的网络代码。

其他提示

python-twisted 中的异步编程, ,您必须决定依赖非标准(外部)库是否适合您的需求。请注意答案 @字形, ,他是 Twisted 项目,并能权威解答任何问题 Twisted 相关问题。

在像 Twisted 这样的库的核心,主循环中的函数不是 sleep,而是像 select() 或 poll() 这样的操作系统调用,由像 Python select 模块这样的模块公开。我说“喜欢”select,因为这是一个在平台之间差异很大的 API,并且几乎每个 GUI 工具包都有自己的版本。Twisted 目前为该主题的 14 种不同变体提供了一个抽象接口。此类 API 提供的常见功能是提供一种方式来表达“这是我正在等待的事件列表。睡觉吧,直到其中一件事发生,然后醒来告诉我是哪一件事发生。”

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top