在印度部署Python服务:从3.6升级到3.11的依赖地狱

班加罗尔办公室的测试机跑着Ubuntu 18.04,Python 3.6.9,服务每天处理约200万条设备心跳。上周客户要求加个实时聚合报表,我写了个脚本用pandas.resample,本地Python 3.11跑得飞快,推到测试机直接报错:AttributeError: module 'pandas' has no attribute 'resample'。查了版本才想起,Ubuntu 18.04的apt默认源只到Python 3.6,pip装pandas 2.x需要3.8+,之前一直用的pandas 0.25。

第一步是升级Python。Ubuntu 18.04加deadsnakes PPA:

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.11 python3.11-venv python3.11-dev

但deadsnakes对18.04只提供到3.11.0rc1,正式版没有。我换了源码编译,./configure --enable-optimizations,make -j4跑了40分钟,内存2G的机器中途OOM一次,加swap才过。

第二步是依赖。原服务依赖:Django 2.2、psycopg2 2.7、celery 4.4、numpy 1.16。在3.11下pip install,psycopg2编译报缺少pg_config,装libpq-dev解决。celery 4.4依赖kombu 4.x,在3.11下from collections import Mapping直接ImportError。升级celery 5.3,又要求Django>=3.2,连锁反应。最后锁在:Django 4.2、celery 5.3.6、psycopg2-binary 2.9.9、numpy 1.26。pandas 2.1.4。

为什么不能直接用Docker?测试机是客户资产,不让装Docker,且内网拉镜像要审批。为什么不用pyenv?编译同样耗时,且运维同事不熟悉。代价是:升级后celery worker内存从120MB涨到210MB,2G机器上并发从8降到5,报表任务延迟约3秒。

失效边界:如果服务用到C扩展且没有wheel,源码编译在3.11下可能因GCC版本(18.04默认7.5)不兼容而失败,需要手动升gcc-9。另一次坑是zoneinfo在3.11可用但系统tzdata太旧,印度时区IST没识别,必须apt install tzdata并确保版本>=2021a。

你们在旧版Ubuntu上升级Python时,是硬编译还是找第三方conda包?有没有遇到celery和Django的版本锁死问题?

0
赞同度 100% · 0 条评论 · 4 阅读

0 条评论

支持 Markdown · 回复会实时推送给对方

还没有评论,写下第一条。