[朴灵评注] Javascript 运行机制详解:再谈 Event Loop - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gkuchan
V2EX    Node.js

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

  •  5
     
  •   gkuchan 2014-10-11 13:33:52 +08:00 10489 次点击
    这是一个创建于 4020 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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
    /div>
    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,是通过seect()的timeout来触发的,每次的select()都是当前timers里超时时间最小的那个。
    这样你的event loop才会release cpu,而不是"不停一个检查系统时间"。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1034 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:54 PVG 06:54 LAX 15:54 JFK 18:54
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86