后端核心:树莓派+Python协程,如何做到十几毫秒响应

0 阅读8分钟

本文是「自主工厂底层操作系统」系列的第二篇。

上一篇讲了全景:一个人,一个树莓派,一个工厂的底层操作系统。

这一篇,我拆开讲后端——为什么一个沾着灰的树莓派5,能撑起80人工厂的全部业务,CPU占用常年20%以下,内存不到2G。

一、先看三张图

图1:跑了快两年的“服务器”

微信图片_20260427203604_420_32.jpg

微信图片_20260427203604_421_32.jpg 这就是我的“数据中心”。

没有恒温恒湿机房,没有机架,没有双路电源。一个几百块的树莓派5,塑料壳上沾着车间的灰,塞在墙角的电控柜旁边。

但它跑了快两年。80人工厂的全部核心数据都在它身上。

图2:htop实时截图

ScreenShot_2026-04-27_203218_042.png PS:这是我在连续不停的点击刷新时候的服务状态

CPU占用常年20%以下,内存不到2G。一个树莓派5,同时跑着FastAPI、MySQL,还挂着几个数据同步脚本。

不是硬件强,是架构省。

图3:API响应时间实测

ScreenShot_2026-04-27_204040_746.png

API数据量响应时间
/get-gongdan100条工单147ms
/get-dabaodan50条打包单89ms
/get-kucunfenxi库存汇总112ms
/create-ruku入库保存95ms

100条工单147ms——包含网络传输、AES加解密、数据库查询、JSON序列化。

树莓派做到的。换好服务器只会更快。

二、一个反共识的起点

开始写这套系统之前,我问了自己一个问题:

我是要写一套“教科书级”的代码,还是要写一套“能在车间跑起来”的代码?

我选了后者。

这意味着变量名可能随意,API命名可能不统一,代码里有重复,一个文件几千行。

但系统在工厂跑了快两年,没崩过。

代码的艺术性是给程序员看的,系统的稳定性是给工厂用的。

三、代码不完美,但实用、稳定、好维护

我承认我的代码不完美。

变量名随意,API命名草率,没严格遵守驼峰还是下划线,一个文件几千行,重复代码到处都是。

但这是故意的。

为什么允许重复?

每个API都有自己的加解密、分页、查询构建。看着臃肿,但换来的是:

  • 故障隔离:一个API出问题,不影响其他
  • 独立修改:改某个API不需要担心影响别的
  • 部署灵活:未来需要拆成微服务,直接复制就行
  • 认知负担低:看一个API文件,就能理解全部逻辑

重复的代价(代码臃肿)vs 复用的代价(耦合、共享状态、调试复杂)。在我的场景里,重复的代价更小

维护成本高吗?不高。

因为有DeepSeek。

以前改一个API要翻半天代码,现在直接把文件丢给DeepSeek,说“把这里改成那样”,它几秒钟就帮我改好。

代码不优雅没关系,AI能读能改就行。

我不是在写“给人看的代码”,我是在写“人和AI都能维护的代码”。这个标准低很多,但效率高很多。

四、为什么我敢用树莓派做服务器?

很多人觉得树莓派是个玩具。但在我的架构里,它是最理想的“压榨对象”。

我的逻辑很简单:

如果这套系统能在树莓派上跑稳,换任何服务器都只会更好。

树莓派5是我能找到的、性能最低的、还能跑Python+MySQL的硬件。我用它做“下限测试”——它能跑通,说明架构没问题;能跑两年,说明架构够稳;CPU只用20%,说明架构够省。

我不是在省钱,我是在验证架构的下限。

换一台正经服务器,性能翻10倍,代码一行不改。

五、当前技术栈(极简但够用)

组件选择理由
Web框架FastAPI异步、高性能、自带API文档
ORMSQLAlchemy (异步)异步支持成熟
数据库MySQL稳定、够用
通信加密AES-128-ECB简单、够安全
部署直接跑在树莓派上无Docker、无K8s、无负担

你可能会问:AES用ECB模式?

我的回答:在我的场景里,够了。

六、为什么能跑这么稳?

1. 异步优先,用尽可能少的线程

FastAPI + 异步SQLAlchemy,是低占用的基石。

python

复制下载

@app.post("/get-gongdan")
async def get_gongdan(request: UserListRequestAES, db: AsyncSession = Depends(get_db)):
    result = await db.execute(query)
    return response

一个Python进程处理所有并发请求,数据库查询时不阻塞,没有线程切换开销。

配合上面的htop图,你能看到——4个核基本没怎么动。

2. 固定密钥 + 主动控制

AES密钥写死在代码里——又一个“不优雅”的决策。

但固定密钥有一个被很多人忽略的好处:它是CS架构下的管理工具。

我的客户端是C++编译的,密钥嵌在里面。如果哪天我需要强制所有用户更新客户端——比如修复了重要bug、增加了新功能、或者怀疑密钥泄露——我只需要做一件事:

换密钥。

服务端一换,旧客户端全部失效。用户必须下载新版本才能继续使用。

这不是安全漏洞,这是版本控制手段。不是被动防御,是主动管理。

我的防御逻辑是这样的:

层级防御手段
第一层内网隔离,攻击者进不来
第二层客户端是QT C++,逆向门槛极高
第三层固定密钥,但监控日志
第四层发现异常,换密钥 + 强制更新客户端

我不是在防御国家级黑客。我防御的是外部扫描器、内部误操作、依赖库漏洞。在这个模型下,固定密钥+强制更新,完全够用,而且好用

3. 性能数据说话

回到最上面的API响应时间图。

100条工单147ms——包含网络传输、AES加解密、数据库查询、JSON序列化。

树莓派做到的。

这个速度,工人点一下屏幕,眨个眼的功夫就回来了。没人觉得慢。

七、接下来,我要压榨出更优的方案

系统跑了两年,很稳。但我很清楚它还能更好。

当前系统装的是Ubuntu Desktop,带了一整套我用不到的东西:图形界面、ROS2、Snapd、ModemManager……这些软件不光占空间,更关键的是它们会在后台默默跑进程、占CPU、占内存、写日志。

下一步,我要把这些无用负载全部剔除,换成Ubuntu Server最小化安装。

这不是“优化”,这是减负。把树莓派从桌面系统改造成纯粹的服务器,让它把全部资源用在刀刃上。

除此之外,还有几个方向:

  • 热点数据入内存:库存、工单这类高频查询数据,从MySQL搬到内存里,读性能从50ms降到1ms以内
  • Python协程 → C++协程:等Python真的不够用了再换,现在CPU才20%,不急
  • 加大与AI服务器的数据同步:增量同步、批量压缩、断点续传,让AI吃上最新鲜的数据

八、演进路线图

text

复制下载

当前(树莓派,跑了两年)
CPU 15-20% | 内存 1.8G | API响应 100-200ms
    │
    ├─ 第一步(近期待办)
    │    └─ 剔除无用软件(图形界面/ROS2等),换Ubuntu Server
    │         → 释放500MB-1GB内存,减少20+后台进程
    │
    ├─ 第二步(3个月内)
    │    └─ 热点数据入内存 → 读性能从50ms降到1ms
    │
    ├─ 第三步(6-12个月,按需)
    │    └─ 热点模块用C++重写 → 性能提升5-10倍
    │
    └─ 第四步(持续)
         └─ 数据同步优化 → AI吃上新鲜数据

每一步,都是可逆的、可度量的、不伤害现有系统的。

我不追求一步到位。我只追求下一步比上一步好。树莓派还能跑,我就继续用Python。等到它扛不住了,换服务器就是降维打击。

九、关于DeepSeek的辅助

最后说一句:这套代码能维护下来,DeepSeek帮了大忙。

以前改一个贯穿多个文件的逻辑,要翻半天,还容易改出bug。现在直接把代码片段丢给DeepSeek,说清楚要改什么,它几秒钟就给出版本。

代码不优雅没关系,AI能读能改就行。

十、写在最后

(插入树莓派实物图、htop图、API响应时间图的位置)

三张图,浓缩了这套系统的全部:

  • 一个沾灰的树莓派
  • 20%的CPU占用
  • 100多毫秒的响应

树莓派只是最便宜的验证样板。

它能跑通,说明架构没问题;能跑两年,说明架构够稳;CPU只用20%,说明架构够省。

换好服务器,只有更好。


下一篇讲桌面客户端——C++/Qt完整工业应用,如何与树莓派后端配合。

欢迎围观,欢迎验证。