V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gkuchan
V2EX  ›  Node.js

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

  •  5
     
  •   gkuchan · 2014-10-11 13:33:52 +08:00 · 10002 次点击
    这是一个创建于 3700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    19 条回复    2014-10-17 09:29:26 +08:00
    seeker
        1
    seeker  
       2014-10-11 13:56:27 +08:00
    我觉得飘零说的对。
    coolicer
        2
    coolicer  
       2014-10-11 14:48:41 +08:00
    “一年前,我写了一篇《什么是 Event Loop?》,谈了我对Event Loop的理解....

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

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


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


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

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

    var JavaScript = JavaScript运行环境;

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

    不过貌似也可以用注解的。
    zzNucker
        10
    zzNucker  
       2014-10-11 16:48:06 +08:00
    @newghost ...不用计较吗, 阮一峰对CPU事件的理解完全是错的。
    willyout
        11
    willyout  
       2014-10-11 17:08:39 +08:00
    仔细阅读,小田说的很多地方也是有矛盾。看不懂。
    otakustay
        12
    otakustay  
       2014-10-11 17:17:57 +08:00
    Event Loop这东西的定义不是在HTML标准里的么……二话不说就给JS带上了,更别说连macrotask和microtask这些基本概念都没讲,也想说清楚event loop是啥……
    willwen
        13
    willwen  
       2014-10-11 17:19:38 +08:00 via iPhone
    @otakustay ECMA把它給搶了⋯
    gkuchan
        14
    gkuchan  
    OP
       2014-10-11 17:27:58 +08:00
    通过这件事,我明白了:原来很多网上写博文的‘大神’,水平其实也就那么回事……
    otakustay
        15
    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
        16
    gamexg  
       2014-10-11 17:48:15 +08:00
    http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html
    他的 进程与线程的一个简单解释 也满上面是问题。
    tomwan
        17
    tomwan  
       2014-10-14 18:47:20 +08:00
    大体上正确,不过确实有点吹毛求疵的感觉,比如:“ [上面这段初步地在说event loop。但是异步跟event loop其实没有关系。准确的讲,event loop是实现异步的一种机制] ”,这句话不是自相矛盾吗。。
    wuliao49
        18
    wuliao49  
       2014-10-15 17:12:44 +08:00
    MARK 待仔细阅读
    ryanking8215
        19
    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,而不是"不停一个检查系统时间"。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1083 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:30 · PVG 06:30 · LAX 14:30 · JFK 17:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.