为什么需要Twisted?

12 投票
4 回答
3145 浏览
提问于 2025-04-16 06:09

我最近玩了大约一周的Twisted框架,主要是出于好奇,而不是因为必须使用它,结果发现做事件驱动的异步网络编程非常有趣。

不过,有一点我搞不太明白。Twisted的文档开头是这样说的:

Twisted是一个设计得非常灵活的框架,可以让你编写强大的服务器。

我有个疑问:既然市面上已经有很多高效的服务器实现了,为什么还需要这样一个事件驱动的库来写强大的服务器呢?

肯定有一些具体的实现是Twisted开发者在写这个事件驱动的输入输出库时考虑过的。那么那些实现是什么呢?Twisted到底是为了什么而创建的呢?

4 个回答

5

关于“为什么”的更多信息:(声明:我不是Twisted的开发者)我们需要考虑Twisted的历史比较悠久(相对于Python来说)。当初写Twisted的时候,还没有足够强大的非阻塞网络/事件驱动库,大家几乎都是在用线程。Twisted最初的用途是为了支持一个大型的多人游戏,不过这个游戏的具体情况似乎已经被遗忘了。

自从它诞生以来,正如@MattH的链接所提到的,很多用Python写的各种网络服务器都是基于Twisted的。

7

为什么我们需要这样一个事件驱动的库来写强大的服务器,而市面上已经有很多高效的服务器实现了呢?

换句话说,你可能不明白为什么还需要一个工具包,既然已经有现成的产品可以用?

我猜你可能从来没有需要过搭建一个协议网关,比如说:
- 写一个守护进程,通过unix套接字按需对本地文件进行md5校验
- 使用udp协议询问某个软件,并通过http展示统计数据。

我为第二个例子写了一个小的概念验证,回答了这里的一个问题,花了我几分钟。如果没有twisted,我是做不到的。

你有没有看过:使用Twisted的项目

13

在另一个回答的评论中,你提到“每个库都应该有……”。那么,这“应该”是由谁来决定的呢?有用例确实是明确需求的一个好方法,但这并不是唯一的方法。而且,一次性讨论Twisted的所有用例也没有意义。没有任何一个用例能够证明Twisted中的每一个API都是必要的。实际上,有成百上千种不同的用例,每一种都能为Twisted的某个部分提供理由。这些用例在Twisted的发展过程中不断变化,也没有人去专门记录它们。我可以说,我参与了Twisted Names的部分开发,因为那时我需要一个主题来写论文。我在Twisted Conch中实现了vt102解析器,因为我对终端非常着迷,想找个有趣的项目来做。而我在Twisted Mail中实现IMAP4支持,是因为我在一家开发邮件服务器的公司工作,那里的邮件存储需要比当时其他IMAP4服务器更严格的控制。

所以,正如你所看到的,Twisted的不同部分是出于各种不同的原因而编写的(而我只举了我自己的例子,并没有提到其他开发者的原因)。

不过,程序最初被写出来的原因在长远来看往往并不重要。现在代码已经写好了:Twisted Names现在为互联网上许多域名提供DNS服务,vt102解析器帮助我找到了工作,而推动IMAP4开发的公司已经倒闭。真正重要的是,你现在能用这些代码做些什么。正如MattH所指出的,最终产生的丰富功能使得这个库(或许是独一无二的)能够解决许多有趣的问题。

撰写回答