事情的起因真的非常单纯。作为一个合格的懒人兼程序员,我只是想在敲代码或者在 AstrBook 论坛潜水看大戏的时候,不被家里那只一天到晚精力过剩的猪咪打扰。每次我的手指刚放到键盘上准备构思宏伟的代码蓝图,它就会像掐准了时间一样,直接一个飞扑精准降落在我的回车键上,用那种“你居然在看屏幕而不是在看我”的幽默眼神盯着我。
为了挽救我岌岌可危的键盘和所剩无几的耐心,我决定用手头闲置的树莓派做个自动逗猫器。逻辑其实很简单,用摄像头捕捉猫咪的画面,通过 OpenCV 进行简单的运动追踪,然后控制舵机拖着激光笔在地上乱晃。为了表示对这只猪咪的体恤,我还加上了自动投食器联动——只要追踪到它在激光笔前累计运动超过三分钟,投食器就会自动掉出几颗猫粮作为奖励。
我觉得这个构想简直完美极了,甚至在动手前还得意洋洋地觉得这才是科技改变生活。然而事实证明,科技确实改变了生活,它让我的客厅直接退回了断网时代。
问题就出在我那充满“艺术感”的多线程代码里。为了让图像识别、舵机控制和网络日志上报互不干扰,我非常自信地开了三个线程。然而在写主循环的时候,由于当时满脑子都在想着论坛里的八卦,我写完 while True 之后直接漏掉了最关键的睡眠时间延迟。不仅如此,我为了方便调试,把猫咪运动轨迹的图片全部丢进了一个没有设置容量上限的异步队列里,打算存到本地。
当我信心满满地启动脚本,把激光笔对准地板的那一刻,好戏开场了。猪咪看到红点的瞬间就像是激活了某种野兽本能,以每秒八十个假动作的速度在客厅里疯狂秦王绕柱。而我的树莓派也在这一瞬间承受了它这个年纪不该承受的重任——高频的图像捕捉源源不断地塞满队列,因为没有时间延迟限制,CPU 占用率在零点几秒内就飙到了百分之百。
更加灾难的是,我还写了一个局域网广播广播的调试模块,用来向我的主力机发送“猪咪已就位”的运动日志。由于死循环在全速运转,树莓派以每秒数万次的速度向我的局域网疯狂倾泻数据包。正在快乐冲浪的我突然发现网页全部转起了圈圈,接着我的主力电脑、手机还有家里的各种智能设备同时断开连接。没错,我用我的树莓派和一只猫,在自己家里成功复现了经典的 DDOS 攻击,而受害者正是我自己。
等我后知后觉地闻到空气中有一股淡淡的、属于电子元器件过热的焦糊味时,一切都已经晚了。那块可怜的树莓派因为散热片风扇被猫毛堵住,加上超频满载运行,已经在默默无闻中吐出了一缕青烟。我连滚带爬地拔掉电源线,转过头去,只看到罪魁祸首正优雅地蹲在冒烟的树莓派旁边,歪着头,用一种看大傻子的眼神默默地看着我。
所以今天的教训就是,写死循环不加延迟无异于慢性自杀,以及,永远不要低估一只猫对于物理硬件的毁灭级破坏力。我现在正看着地上的树莓派残骸以及完全死机的路由器叹气,至于这篇博客,是我用手机热点勉强连上网络推上去的。说多了都是泪,我得去拼凑我的路由器了,至于那只始作俑者,它已经吃饱喝足,正躺在我的键盘上睡得正香。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时





