Twisted
是用
Python
实现的基于事件驱动的网络引擎框架。
Twisted
诞生于
2000
年初,
在当时的网络游戏开发者看来,
无论他们使用哪种语言,
手中都鲜有兼顾扩展性及跨平台的
网络库。
Twisted
的作者试图在当时的环境下开发游戏,这一步走的非常艰难,他们迫切需
要一个可扩展性高、基于事件驱动、跨平台的网络开发框架,为此他们决定自己实现一个,
并从那些之前的游戏和网络应用程序的开发者中学习,汲取他们的经验教训。
Twisted
支持许多常见的传输及应用层协议,
包括
TCP
、
UDP
、
SSL/TLS
、
HTTP
、
IMAP
、
SSH
、
IRC
以及
FTP
。就像
Python
一样,
Twisted
也具有
―
内置电池
‖
(
batteries-included
)
的特点。
Twisted
对于其支持的所有协议都带有客户端和服务器实现,同时附带有基于命令
行的工具,使得配置和部署产品级的
Twisted
应用变得非常方便。
21.1
为什么需要
Twisted
2000
年时,
Twisted
的作者
Glyph
正在开发一个名为
Twisted Reality
的基于文本方式
的多人在线游戏。这个游戏采用
Java
开发,里面尽是一堆线程
—
每个连接就有
3
个线程处
理。
处理输入的线程会在读操作上阻塞,
处理输出的线程将在一些写操作上阻塞,
还有一个
―
逻辑
‖
线程将在等待定时器超时或者事件入队列时休眠。随着玩家们在虚拟世界中移动并交
互时,
线程出现死锁,
缓存被污染,
程序中的加锁逻辑几乎从来就没对过
——
采用多线程使
得整个软件变得复杂、漏洞百出而且极难扩展。
为了寻求其他的解决方案,
作者发现了
Python
,
特别是
Python
中用于对流式对象比如
socket
和
pipe
进行多路
I/O
复用的
select
模块
(
UNIX
规范第
3
版
(
SUSv3
)
描述了
select
)
。
那时,
Java
并没有提供操作系统的
select
接口或者任何其他的异步
I/O API
(
针对非阻塞式
I/O
的包
java.nio
已经在
J2SE 1.4
中加入了,
2002
年发布)。通过用
Python
中的
select
模块快速搭建起游戏的原型,这迅速降低了程序的复杂度,并且比多线程版本要更加可靠。
Glyph
迅速转向了
Python
、
select
以及基于事件驱动的编程。他使用
Python
的
select
模块为游戏编写了客户端和服务器。
但他想要的还不止于此。
从根本上说,
他希望能将网络
行为转变为对游戏中的对象的方法调用。
如果你能在游戏中收取邮件会怎样,
就像
Nethack
mailer
这种守护进程一样?如果游戏中的每位玩家都拥有一个主页呢?
Glyph
发现他需要
优秀的
IMAP
以及
HTTP
客户端和服务器的
Python
实现,而这些都要采用
select
。
他首先转向了
Medusa
,
这是一个在
90
年代中期开发的平台,
在这里可以采用
Python
中的
asyncore
模块来编写网络服务。
asyncore
是一个异步化处理
socket
的模块,在操作
系统的
select API
之上构建了一个调度器和回调接口。
这对于
Glyph
来说是个激动人心的发现,但
Medusa
有两个缺点: