[朴灵评注] JavaScript 运行机制详解:再谈 Event Loop

2014-10-11 13:33:52 +08:00
 gkuchan
看热闹不嫌事大

https://app.yinxiang.com/shard/s8/sh/b72fe246-a89d-434b-85f0-a36420849b84/59bad790bdcf6b0a66b8b93d5eacbead
9802 次点击
所在节点    Node.js
19 条回复
seeker
2014-10-11 13:56:27 +08:00
我觉得飘零说的对。
coolicer
2014-10-11 14:48:41 +08:00
“一年前,我写了一篇《什么是 Event Loop?》,谈了我对Event Loop的理解....

.....这才尴尬地发现,自己的理解是错的。我决定重写这个题目,详细、完整、正确地描述JavaScript引擎的内部运行机制。下面就是我的重写。”
jsonline
2014-10-11 14:52:48 +08:00
接楼上,然后发现又是错的,JS真TM难,我一个博士都学不会。
j1anb1n
2014-10-11 14:56:58 +08:00
我觉得把自己的想法做个实验就知道了嘛,文中有些地方明显是空想的。
witcher42
2014-10-11 15:37:45 +08:00
@j1anb1n Hello~
233
2014-10-11 15:57:23 +08:00
我只想问,这篇文章今天这么火,作者大象笔记这个月的流量差不多要交代了吧...
willwen
2014-10-11 15:57:29 +08:00
以我跟小田(我對樸靈的稱謂)對JS的運行機制來理解,阮老師根本在瞎扯⋯
Watcher機制把Event Loop中事件和事例剝離開,Event Loop允許沒有Sender或Handler,異步事件可以從任何地方產生,不一定是IO請求。

再用小田的比喻,Event Loop好比餐廳,正常的流程是顧客(Sender)發送請求,廚師(Process)處理請求,傳菜員(Watcher)守在那,不斷問有沒有菜要上(Loop),如果有就看看這道菜(event type)有哪些顧客(Handler),就分給他們(有可能他們都走了,也有可能本來就是廚師做錯菜)。也有可能是乞丐來到這裡,等待餐廳或者別的人施捨(從外部的傳入事件)。
newghost
2014-10-11 16:00:18 +08:00
有一些只是表述上的差异,其实本质意思是一样的,打个比方:


只要主线程空了,就会去读取"任务队列",这就是JavaScript的运行机制。这个过程会不断重复


这里的表述,"JavaScript的运行机制" 明显写起来简单,其实“JavaScript运行环境的运行机制”也不完全准确,毕竟还有一些JS运行环境(解释器)是按同步多线程的机制来设计的,写成,“目前主流浏览器和node.js的运行环境的运行机制”,会不会更准确,你你会不会更很啰嗦?

真的不必太较汁,照这个抠法,除了人教版的小学教材,极少完全严谨的说法。怪只怪中国语言博大精深。
luoyou1014
2014-10-11 16:46:39 +08:00
@newghost
怪只怪语言没有变量定义

var JavaScript = JavaScript运行环境;

把所以可能误解的地方定义一下,就不担心有错啦。

不过貌似也可以用注解的。
zzNucker
2014-10-11 16:48:06 +08:00
@newghost ...不用计较吗, 阮一峰对CPU事件的理解完全是错的。
willyout
2014-10-11 17:08:39 +08:00
仔细阅读,小田说的很多地方也是有矛盾。看不懂。
otakustay
2014-10-11 17:17:57 +08:00
Event Loop这东西的定义不是在HTML标准里的么……二话不说就给JS带上了,更别说连macrotask和microtask这些基本概念都没讲,也想说清楚event loop是啥……
willwen
2014-10-11 17:19:38 +08:00
@otakustay ECMA把它給搶了⋯
gkuchan
2014-10-11 17:27:58 +08:00
通过这件事,我明白了:原来很多网上写博文的‘大神’,水平其实也就那么回事……
otakustay
2014-10-11 17:33:18 +08:00
@willwen 我能找到的只有在strawman的cocurrency章节会提到Event Loop,拿稻草人这种连草案阶段都不到的去说我感觉并不合适啊,何况这一章节仅是在说ECMA对并发以及异步的处理,而文章已经将它放大到了JavaScript整个的执行机制上,并不确切
另一方面,HTML定义的那个Event Loop是真正的一个执行模型,和ECMA这个是2个东西,要说“抢”也不大合适:)HTML建队上还和本身的render、paint有关,所以有macrotask和microtask这些东西了
gamexg
2014-10-11 17:48:15 +08:00
http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
他的 进程与线程的一个简单解释 也满上面是问题。
tomwan
2014-10-14 18:47:20 +08:00
大体上正确,不过确实有点吹毛求疵的感觉,比如:“ [上面这段初步地在说event loop。但是异步跟event loop其实没有关系。准确的讲,event loop是实现异步的一种机制] ”,这句话不是自相矛盾吗。。
wuliao49
2014-10-15 17:12:44 +08:00
MARK 待仔细阅读
ryanking8215
2014-10-17 09:29:26 +08:00
[定时器并不是特例。到达时间点后,会形成一个事件(timeout事件)。不同的是一般事件是靠底层系统或者线程池之类的产生事件,但定时器事件是靠事件循环不停检查系统时间来判定是否到达时间点来产生事件]
这句扯淡,让人以为定时器实现是event loop一直在检查系统时间,然后再触发,但这样做是很低效的。linux2.6.27以后有了timerfd_create(),时间一到就fd就可读,这样event loop可以epoll或者select在这个fd,不占用cpu;
就算不是用timerfd实现,例如libevent,是通过select()的timeout来触发的,每次的select()都是当前timers里超时时间最小的那个。
这样你的event loop才会release cpu,而不是"不停一个检查系统时间"。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/138279

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX