Twisted是httplib2/socket的替代品吗?

opa*_*isy 6 python sockets networking twisted httplib2

许多python库,即使是最近编写的,也使用httplib2或套接字接口来执行网络任务.

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

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

  1. 是否应该使用Twisted写入新的网络代码(小命令行工具除外)?
  2. 你会在同一个项目中混合使用Twisted,http2lib或socket代码吗?
  3. 对于大多数库来说,它是扭曲的pythonic(它比替代品更复杂,引入了对非标准包的依赖...)?

编辑:请让我用另一种方式说出来.您是否觉得使用Twisted编写新的库代码可能会增加其采用的障碍?Twisted有明显的好处(特别是gimel所说的可移植性和可伸缩性),但是它不是一个核心python库的事实可能会被一些人认为是一个缺点.

gim*_*mel 5

请参阅asychronous-programming-in-python-twisted,您必须决定是否符合非标准(外部)库以满足您的需求.请注意@Glyph的答案,他是该Twisted项目的创始人,可以权威地回答任何Twisted相关问题.

在像Twisted这样的库的核心,主循环中的函数不是睡眠,而是像select()选择模块之类的模块所公开的操作系统调用,如select()或poll().我说"喜欢"选择,因为这是一个在平台之间变化很大的API,几乎每个GUI工具包都有自己的版本.Twisted目前为此主题提供了14种不同变体的抽象界面.这种API提供的常见问题是提供一种说法"这是我正在等待的事件列表.进入睡眠直到其中一个发生,然后醒来并告诉我它们是哪一个. "


Unk*_*own 0

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

  • -1。第 1 点:twisted 适用于任何规模的网络代码,您的限制不适用。线程包装的代码性能最差,并且很难正确执行和调试。第 2 点:不。如果我可以使用完整的扭曲堆栈,为什么我要使用 http2lib 或套接字?Pont 3:Asyncore/异步聊天,认真的吗?:( (8认同)
  • @nosklo:第一点:你就是我所说的那种扭曲的狂热者。毫无疑问,twisted 更复杂。如果您使用队列进行线程间通信,则线程包装的代码很容易正确,我非常怀疑性能对于大多数应用程序来说是否重要。第2点:您是否正在考虑制作一个网络服务器?我想不是。第 3 点:认真对待 Asyncore/Asynchat...请参阅第 1 点。 (3认同)
  • @Unknown:第一点:对于可以直接使用套接字编写的每一段异步代码,我可以使用twisted以更简单、更易读的方式编写相同的代码。特别适合小规模。Point2:我说的是*混合扭曲和httplib/socket代码*而不是制作网络服务器。我认为没有意义,因为如果我扭曲了为什么我会直接使用套接字/httplib?3) asyncore/asynchat 很糟糕,你知道的。 (3认同)
  • @nosklo:抱歉,但如果您需要做的只是 urllib2.urlopen("website.com"),那么启动扭曲引擎并不容易。是的,asyncore 和 asynchat 并不那么完整,但也没有那么粗糙。如果您曾经在 Windows 中运行过 Twisted,您会注意到它打开了一个环回端口。为什么 async/ore/chat 不需要这样做?另外:Twisted = 6 mb Asycore/chat = 32kb (2认同)