EVE启动Python 2迁移:95.9%的文件能编译,最难的恰恰是"看起来没事"的那部分

源自8位全网作者

05:16

8月25日,EVE Online官方发了篇不太像游戏公告的公告:《The Move to Python 3 Begins!》。翻译成人话就是——这款2003年上线、跑了23年的太空MMO,正式把服务器里240万行Python 2代码往Python 3上搬。第一批改动已经部署到正式服"宁静"(Tranquility),官方给这次迁移定的成功标准只有一条:玩家什么都不该感觉到。EVE官网

对圈外这是条游戏新闻,对Python圈这是一颗深水炸弹:Python 2.7早在2020年就停止官方维护,"Python 2钉子户"这个梗大家嘲了六年,结果2026年,最硬核的那个钉子户真的开始搬家了。而它搬家时晒出来的家底,比迁移本身更值得逐行看。

一、它凭什么钉子到2026年

EVE用的不是普通Python,是Stackless Python——一个支持轻量级"任务片"(tasklet)的特殊分支,让单台服务器节点能同时伺候几千名飞行员。"一个宇宙、一服到底"的卖点,技术上就建立在这上面。EVE不只是用户,还是Stackless最重要的贡献者之一。

官方时间线很直白:2007年升到Stackless 2.5,2010年升到2.7,之后就是16年不动——这16年里Python从3.0一路出到3.14,EVE的底层语言停在了2010年。EVE官网

为什么不升?不是懒。这套代码要跑的游戏,每天只有15分钟停机窗口——用官方的说法,它"每24小时里有23.75小时必须在呼吸"。EVE官网 星门跳跃、市场挂单、舰队会战全靠这套引擎,对这种系统,一次大版本升级的风险长期大于收益,能不动就不动。

EVE启动Python 2迁移:95.9%的文件能编译,最难的恰恰是

二、第一个反常识:95.9%双版本编译通过,好消息只占一半

CCP工程师的第一步不是改代码,是"称重":把约2万个Python文件每个都同时扔进真实的Python 2.7和Python 3解释器里编译,用编译器当基准。第一遍扫描的结果让团队意外——95.9%的文件在两个版本下都已能编译通过,被Python 3语法直接拒绝的阻塞行只有约3300行。EVE官网 官方给这3300行拆了账:

  • 约1500处老式print语句

  • 约800处`123L`式的long字面量

  • 约600处"EVE诞生前就被废弃"的异常写法

  • 50处`<>`——一种老到很多在职Python开发者从没见过"不等于"写法

这3300行不需要人,交给Python-Future(基于Python官方2to3的改写机器)自动修就行。看起来山很小?这就是第二个数字登场的时候。

三、第二个反常识:能编译,不等于一样跑

同一遍扫描还测出约2万行代码:Python 2和3下都编译通过,但行为不一样。最经典的就是除法——Python 2里`1 / 2`等于0,Python 3里等于0.5。EVE官网 放到EVE里,这个数字可能是伤害值、ISK数量或者空间坐标,官方态度很清醒:每一行都需要人来判断是保留旧语义还是接受新行为。

所以迁移分阶段,第一阶段的真正目的不是"迁完",而是把机械差异清零,让后面的人类注意力只花在需要判断力的地方。这个顺序值得每个维护老项目的团队抄作业:先让机器干确定性的活,再让人干只有人能干的活。

四、真正难的不是语法,是并发模型

严格说这不是EVE第一次迁Python 3——和EVE Frontier共用的Carbon引擎已经先走完了。规划从2023年3月开始,先把代码从Stackless 2.7升到Stackless 3.8.1,然后做了一个果断决定:不在3.8停留,直接跳到Python 3.12——因为Stackless的最高版本只到3.8,而Python 3.8自己在2024年10月也停止维护了,停在3.8等于过两年再迁一次。知乎

Frontier那一仗的战果是:400万行Python代码,5,840个文件被修改,80,564行发生变更,C++与Python的接口层全部重写,网络协议栈大改,最终换来10%到30%的性能提升。知乎

EVE启动Python 2迁移:95.9%的文件能编译,最难的恰恰是

而整个工程里最硬的骨头不是语法,是tasklet没了。Stackless的核心并发机制在标准Python里没有直接对应物,asyncio需要显式标记协程函数,和tasklet的编程模型差异太大——CCP最终选择greenlets加自研调度器来顶替,绕过了gevent,因为它的Cython实现和CCP自己的C++调度层配合不理想。知乎 这提醒所有想"升级顺便现代化"的团队:语言版本是表层,编程模型才是地基。

五、为什么这次Tranquility比Frontier难一个量级

Frontier的数据是新的;Tranquility服务器里存着23年的玩家历史——每一个角色、每一点技能、每个机库里每一件装备,都是Python 2时代写进去的,迁到Python 3之后必须一个字不差地读回来。这就是为什么第二阶段、第三阶段(真正把运行时切过去)到现在没有时间表。官方原话写得很明白:清除机械障碍是容易的部分,真正要逐行审阅的代码还在前面等。EVE官网 7月他们已经在测试服Singularity拉玩家测过第一轮,8月25日第一批改动上正式服,接下来还在准备agent mission任务的Python 3后端。

不过EVE有个别人没有的优势:Frontier已经把路蹚出来了——调度器替换方案、C++接口适配、网络栈重写都是验证过的,Tranquility大概率复用同一条路线。EVE Frontier官网

EVE启动Python 2迁移:95.9%的文件能编译,最难的恰恰是

六、社区反应:先拆三个流传最广的误会

微博和B站的EVE区这几天吵得挺热闹,几个高赞说法其实都值得掰扯。

“Python什么时候和性能沾边了,要换就换高性能语言”——误会了角色分工。EVE的重活(渲染、物理、网络)在C++层,Python写的是服务器侧逻辑:gate跳跃结算、市场挂单、会战判定这些"业务层"。哔哩哔哩 换语言救不了什么,但官方列的升级理由恰恰是生态:现代库、调试器、性能分析工具全为Python 3而生,在Python 2上多待一年,就多一年只能自己养旧工具、没法专心改游戏。

“第一次听说游戏引擎用Python写的”——B站评论区自己就把这条纠正了:引擎主体不是Python,Python是跑在引擎之上的服务器逻辑层。哔哩哔哩 这也解释了为什么C++与Python的接口层要全部重写——那才是这活最重的部分。

“说白了就是新来的看不懂屎山,让AI写一版人工调调”——这条高赞猜测恰恰猜反了。CCP用的主力工具是2to3血脉的Python-Future,不是大模型;行为差异那2万行官方明确要人来逐行审。哔哩哔哩 AI翻译老代码目前能加速的是机械部分;判断"这个0和0.5哪个才是策划想要的",还是得工程师自己来。

倒是另一句弹幕式质疑值得记着:"Python 2→3不可能解决团战幻灯片。哔哩哔哩“官方其实也没许诺这个:原话是"未来这会打开一扇通往更快EVE的门,但现在说具体意味着什么还太早”。EVE官网 会战卡不卡取决于TiDi架构,不是语言小版本。别拿迁移当特效药。

七、这份作业能抄什么

抛开星战沙盒,这几乎是一场公开直播的教科书级遗留系统迁移,三类人各有所得:

  1. 维护老系统的工程师:学CCP的"双运行时编译扫描"——先花力气测量,再决定动刀。你那个"看起来很老"的代码库,可能95.9%早就兼容了,真正要排队的只是那3300行语法和2万行行为差异。

  2. 在做技术规划的负责人:EVE用16年证明了"稳定到不敢动"是真实存在的状态,也用这场迁移证明了不动的代价逐年上升——工具链断供、招不到会用这版本的人。不迁不是零成本,是把成本推给未来。

  3. 还在学Python的新手:一个冷知识,你日常抱怨的pip装不上老库、教程版本对不齐,背后就是这场横跨二十多年迁移的长尾。语言升级的最后一公里,从来都是人肉走完的。

接下来值得盯的信号:Stage 2行为审查何时启动、Singularity会不会再拉公众测试、切换运行时的公告什么时候出。这三件事任何一件有动静,都说明这场"换心手术"又推进了一段。

官方博客的落款是这届开发者最有圈层味道的签名:“Fly safe, on whatever version of Python you find yourself.”——祝你在你所在的那个Python版本里,飞行平安。EVE官网

你的公司或你手上还有在跑的Python 2项目吗?评论区聊聊它是怎么活到2026年的。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章