如何在Python中构建支持热代码替换的Twisted服务器?

5 投票
1 回答
656 浏览
提问于 2025-04-16 11:01

我开发了一套音频流媒体服务器,都是用Python和Twisted框架做的。它们能正常工作,但我遇到一个问题:当我发现服务器运行中有一些bug,或者想在服务器上添加新功能时,我需要停止服务器然后重新启动。和HTTP服务器不同,随时重启HTTP服务器没问题,但音频流媒体服务器就不行。一旦我重启流媒体服务器,用户就会断开连接。

我尝试过设置一个manhole(这是Twisted服务器的一个SSH服务,你可以登录后在控制台输入Python代码来做一些事情),并通过控制台连接,实时重新加载Python模块。这个方法有时有效,但控制起来很麻烦。你永远不知道服务器里有多少旧类的实例,有些可能很难访问,而且类之间的关系会非常复杂。此外,这种方法在某些情况下有效,但有时你确实需要重启服务器,比如你正在用选择器反应器运行服务器,但想换成epoll反应器,那就必须重启。另外,当内存使用过高时,也需要重启服务器。

为了构建这样的系统,我脑海中闪现了一个想法:是否可以将连接和数据从一个进程转移到另一个进程?举个例子:

我们有一个名为Broadcasting的服务器,当前运行的版本是rev.123,我们想用rev.124替换它。

Broadcasting rev.123 is running....
Startup Broadcasting rev.124 ....
Broadcasting rev.124 is stand by
Hand over connections from instance of rev.123 to instance of rev.124
Stop Broadcasting rev. 123 instance

这可能吗?我不太确定socket句柄的生命周期是否和进程绑定。我认为一个进程创建的socket在该进程被杀死时会关闭,但我不太确定。如果可能的话,有没有什么指导方针或文章可以帮助设计这种热代码替换机制?对于Twisted来说,有没有现成的解决方案可以实现我想要的功能?

谢谢。

1 个回答

5

我在2004年的PyCon大会上做过一个关于这个主题的演讲,大家可以去看看这个链接。另外,Twisted这个框架也在努力增加一些功能来帮助解决这个问题,具体可以查看这个链接

撰写回答