【问题标题】:Models of concurrency in nodejsnodejs中的并发模型
【发布时间】:2011-07-06 10:13:37
【问题描述】:

有谁知道 nodejs 中的内存和线程模型是什么?

特别是ii++ 是原子的吗?在 Java 1.5、Java 1.4、C 中,ii 的行为是像 volatile,还是根本不像?

【问题讨论】:

  • 请注意 node.js 是单线程的。
  • @Raynos:不完全是。 Javascript 在单个线程上运行,但阻塞 IO 是在单独的线程池上完成的。 “当然,在后端,有用于数据库访问和进程执行的线程和进程。”引用:blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop
  • 更正:对于所有 关心的 node.js 是单线程的。

标签: javascript node.js multithreading concurrency


【解决方案1】:

只有一个线程(事件循环),除非您执行 I/O 等异步操作,否则您的代码永远不会中断。您不能执行任何并行代码执行。因此 ii++ 是原子的

【讨论】:

  • 如果你解决了灰色区域会很好。例如,这个呢:dsomething();做其他事情(); ???
  • @Michael 没有灰色区域。 doanotherthing() 总是在 dosomething() 之后执行,而不能在两者之间切换控制(除了 dosomething() 引发异常)。另请参阅@Matt 的答案,其中更详细地解释了这一点。
  • 灰色区域是两个函数调用是连续的,除非它们进行 I/O,并且在使用 3rd 方代码时并不总是很清楚。
【解决方案2】:

Understanding the node.js Event Loop 是一篇很好的文章,它解释了 node.js 中什么是异步,什么不是异步。如果您能理解,您将能够确定您的应用程序在哪里具有异步行为,在哪里没有。通过理解这一点,您可以在需要时显式地编写顺序代码。 EventEmitters 是关键。

单线程听起来与 node.js 具有高性能和可扩展性的想法不一致,所以看看这个article from Yahoo on Multicore

【讨论】:

    【解决方案3】:

    了解 node 和 V8 如何交互很有用。节点处理等待来自操作系统的 I/O 或计时器。当节点从 I/O 或定时器唤醒时,它通常有一些 JavaScript 回调要调用。当 node 运行这些回调时,控制权被传递给 V8,直到 V8 返回 node。

    因此,如果您执行var ii = 1; ii++;,您将永远不会发现 ii 不是 2。所有 JavaScript 都会运行直到完成,然后将控制权传递回节点。如果您执行doSomething(); doSomething();,它将始终运行 doSomething 两次,并且在第二次调用 doSomething 返回之前,它不会返回到节点的事件循环。这意味着您可以完全锁定节点,避免像这样的简单错误:

    for (var i=0 ; i >= 0 ; i++) {}
    

    这与您注册了多少 I/O 回调、设置为关闭的计时器或等待读取的套接字无关。在 V8 从那个无限循环返回之前,节点不再工作。

    这也是 node 编程如此美妙的部分原因。您永远不必担心锁定。没有竞争条件或关键部分。您的 JavaScript 代码只有一个线程运行。

    【讨论】:

    • 我有一个愚蠢的时刻,一秒钟没有意识到为什么这是一个无限循环。对于像我这样慢的人,请记住 for 循环中的第二个条件是 continuation 的条件,而不是终止条件。 IE。终止的标准 for 循环是“for (var i = 0; i
    • 真的无限吗?我不会在某个时候回过头来变得消极吗?
    • 试试这个:9007199254740992 + 1
    • "您永远不必担心锁定问题。没有竞争条件或临界区。"我经常听到关于 Node.js 的消息。仅仅因为它是单线程的并不意味着你不能遇到上述问题。如果两个请求碰巧导致数据库操作按“读、读、写、写”的顺序调用,则两个请求执行balance += 10 的经典“银行账户示例”在单线程异步环境中同样容易失败.
    • 但它不是线程锁定(如在 java 中)。它更多地与数据库原子性有关。不? @JHH
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 2010-12-11
    • 2012-02-10
    • 2014-02-06
    • 2020-04-06
    相关资源
    最近更新 更多