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

node.js 的事件循环,是多线程?

  •  1
     
  •   coolicer · 2015-09-28 17:25:48 +08:00 · 4686 次点击
    这是一个创建于 3340 天前的主题,其中的信息可能已经有所发展或是发生改变。
    跑好之后,再丢给队列吗?
    11 条回复    2015-09-30 23:35:02 +08:00
    jswh
        1
    jswh  
       2015-09-28 17:26:54 +08:00
    单线程
    coolicer
        2
    coolicer  
    OP
       2015-09-28 17:28:31 +08:00
    @jswh 哭了

    看来我还是不懂 node
    int64ago
        3
    int64ago  
       2015-09-28 17:29:06 +08:00
    底层是多线程的,只是在 JavaScript 这一层才是单线程的
    jswh
        4
    jswh  
       2015-09-28 17:29:38 +08:00
    http://blog.getify.com/promises-part-1/这系列文章的第一部分解释了 js 引擎单线程并发的原理,讲得挺清楚的
    wuliao49
        5
    wuliao49  
       2015-09-28 17:56:03 +08:00
    3 楼是对的。不分青红皂白的说 NODE 就是单线程的朋友进误区了
    joyee
        6
    joyee  
       2015-09-28 18:03:12 +08:00
    Node.js 里 JavaScript 代码的执行是单线程的,但是在底层无论是 V8 还是 libuv 都不是,比如 V8 是一个线程做编译执行一个线程做优化几个线程负责 GC 还有线程负责 profiling 找 JIT 目标, libuv 有线程池配合 epoll 之类做 I/O 多路复用,还有其他部分也是……
    jswh
        7
    jswh  
       2015-09-28 18:15:07 +08:00
    @wuliao49
    @joyee
    楼主问得是事件循环。可能我理解错了,我想说的只是 node 的并发并不是并行。
    joyee
        8
    joyee  
       2015-09-28 20:18:30 +08:00
    @jswh JavaScript 本身跟事件循环没太大关系的,你在 ECMAScript 的 spec 里是看不到相关的东西的,同理你在 V8 里也找不到类似什么 setTimeout 之类的东西……浏览器里的事件循环属于 BOM , Node 里的事件循环是包装了 libuv 而已, libuv 是有线程池的
    lcj2class
        9
    lcj2class  
       2015-09-29 22:53:22 +08:00
    we
        10
    we  
       2015-09-30 20:07:16 +08:00
    darluc
        11
    darluc  
       2015-09-30 23:35:02 +08:00
    9 楼的图不错哦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3447 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 11:25 · PVG 19:25 · LAX 03:25 · JFK 06:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.