news 2026/6/25 18:45:50

一个 setTimeout 引出了事件循环问题,这个事件循环到底是个啥?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一个 setTimeout 引出了事件循环问题,这个事件循环到底是个啥?

昨天,在使用 Browser-Bridge 的时候,我发现每次执行浏览器指令时都是数据返回后还会等几秒才结束命令行。我就奇怪了,为什么别的 shell 命令执行时都是数据返回之后立马结束,而 bridge 命令会有明显的延迟?

好吧,让 Coding Agent 先看看,修复然后给我一个结论。

输入之后,我就去活动活动,舒展筋骨,喝了口水。

等我回到工位,我发现问题修复了。仔细一看,代码就改了一行,但总结却说了一大堆什么的,唯一让我印象深的是“事件循环”。

function waitForOpen () => { // 每 50ms 轮询一次 readyState const check = setInterval(() => { if (readyState === OPEN) { clearInterval(check); clearTimeout(timeout); // 修复后才有 resolve(); } }, 50); // 5 秒后认为连接失败 const timeout = setTimeout(() => { clearInterval(check); reject(new Error('Connection timeout')); }, 5000); } using client = new ManagedClient(options.server); // ← 块作用域开始 await client.waitForOpen();

我想着“这是啥?之前 python 项目里面似乎也有”看来这个概念是逃不掉的,得学~~

神秘的事件循环就是一个死循环

开始还以为是什么特别复杂的概念。一搜,发现这个的意思是在说执行代码的时候是单线程死循环,不停地执行任务队列中的任务。

拆成两部分就好理解了。事件指代的是待处理的任务(定时器、I/O、交互事件等等几乎所有方法调用都可以认为是事件),循环就是死循环~

或者,你把它理解为一个生产-消费者模型。事件循环指的就是用 while(true) 这样的方式不停地处理所有的消费者事件。

那回到刚刚的问题,这代码怎么就导致事件循环不能正常处理了呢?或者,为什么会延迟几秒呢?

// 每 50ms 轮询一次 readyState const check = setInterval(() => { if (readyState === OPEN) { clearInterval(check); clearTimeout(timeout); // 修复后才有 resolve(); } }, 50);

setInterval 里面在修复之前时没有 clearTimeout 的,所以主循环就会等待5s,超时之后才会继续执行,所以 Agent 跟我是事件循环导致有5s延迟,实际上是因为 setTimeout 泄露了。

这 Agent 把这理解的高度整的也太高了,直接整到了底层线程执行模型了!

但这,气氛都烘到这儿了,我突然又开始好奇了。为什么 Java 可以多线程执行?我在 JavaScript 和 Python 中能看到这样的语法,但底层都是事件循环,并不是多并发?

点击链接查看和 Kimi 的对话 Kimi | 循环Reactor

有兴趣的看看我和Kimi的对话,这里我简短点儿讲就是因为动态类型的语言,动态语言没法确定内存里面每个引用其后对象的大小。因为这一秒这个对象是 int,下一秒变 dict,内存不能预测,这导致无法做精确的逃逸分析、锁省略、无锁数据结构——编译器不知道指针会逃向何方,所以,只能放弃多线程。

难道经常说后端不能使用动态类型的语言是因为这个性能问题?

单纯从事件循环的CPU利用效率来看,其实它是高于多线程的。为什么很少人拿它做一些大规模的后端(基础设施)服务?

关键问题我觉得有两个。

一是响应不稳定。遇到高并发之后,如果某任务中需要使用较多的CPU,那后续任务就会被阻塞。

二是硬件资源浪费。现在的CPU都是多核,如果一个64核的CPU只能用一个核,那这相当于在花钱打水漂。

那为什么又适合前端呢?

我能想到的一种合理的解释就是,DOM并发操作的问题。最初的设计者也许是发现并发操作(渲染)DOM会有大量的锁冲突,还不如单线程提升对单核CPU的利用率。

--附录

点击链接查看和 Kimi 的对话 Kimi | 循环Reactor

Browser-Bridge: https://github.com/dkisser/browser-bridge

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 18:45:39

2026年小区家用充电桩推荐,物业易审批、安装友好的合规款

对于小区业主来说,安装家用充电桩,除了关注产品本身的使用体验,能否顺利通过物业审批、适配小区车位安装条件,是不少车主关心的问题。小区地下车库、户外车位环境各异,物业对充电桩的合规性、安全性、防护性也有明确要…

作者头像 李华
网站建设 2026/6/25 18:45:27

服务器病毒木马应急响应全流程:从隔离取证到清除加固

1. 项目概述:当服务器“生病”了,我们该怎么办?想象一下,你正喝着咖啡,突然收到监控告警,服务器CPU飙到100%,网络流量异常,甚至业务页面被篡改。那一刻,肾上腺素飙升的感…

作者头像 李华
网站建设 2026/6/25 18:42:58

在喧嚣的AI浪潮下,如何为微信自动回复接口筑起看不见的信任资产

在当下的私域自动化开发环境中,微信自动回复接口 几乎是所有智能化系统的标配。但在这个喧嚣的 AI 时代,技术竞争的维度已经发生了根本性降维打击:你所写出的自动回复逻辑、所沉淀的业务知识库,在大模型的搜索引擎眼中&#xff0c…

作者头像 李华
网站建设 2026/6/25 18:42:41

回归KPI不是公式,而是业务问题的翻译器

我理解你的要求,也完全认同内容安全与专业性的极端重要性。作为一位在数据科学与机器学习领域深耕十余年的实战型博主,我经手过数百个模型评估、面试辅导与工业级回归项目——从电商销量预测到金融风险评分,从IoT设备退化建模到医疗指标回归推…

作者头像 李华
网站建设 2026/6/25 18:41:15

PX4神经网络控制技术在电力巡检无人机中的架构设计与工程实践

PX4神经网络控制技术在电力巡检无人机中的架构设计与工程实践 【免费下载链接】PX4-Autopilot PX4 Autopilot Software 项目地址: https://gitcode.com/gh_mirrors/px/PX4-Autopilot 引言:电力巡检的技术挑战与智能化需求 电力线路巡检是电力系统运维中的核…

作者头像 李华
网站建设 2026/6/25 18:39:56

Linux 磁盘管理完整指南:从 Disk 到 Mount

Linux 磁盘管理完整指南:从 Disk 到 Mount 在 Linux 中,一块磁盘从“未使用”到“可用存储”,必须经历一套标准抽象层级: Disk → GPT → Partition(s) → Filesystem → Mount理解这条链路,是掌握 Linux 存储管理的核…

作者头像 李华