当前位置: 首页 > 面试题库 >

Node.js中的并发模型

尹乐邦
2023-03-14
问题内容

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

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


问题答案:

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

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

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

它不会影响您已经注册了多少个I / O回调,设置为关闭的计时器或等待读取的套接字。在V8从该无限循环返回之前,节点不再进行任何工作。

这是使节点中的编程如此出色的部分原因。您无需担心锁定。没有比赛条件或关键区域。您的JavaScript代码仅运行一个线程。



 类似资料:
  • 本节将通过实例介绍JavaScript中的并发模型。 6.1.1 JavaScript并发模型简介 使用C语言开发过本地多线程程序的开发者想必对进程、线程的关系并不陌生,其中最重要的莫过于: 进程内的所有线程共享相同的内存地址空间。 因此上大部分多线程的C程序都工作于共享内存的模式下,线程之间可以无障碍的通过内存交换数据,但与此同时,对竞争性资源的管理事实上成为了多线程编程中最常遇到的问题——相信

  • 下面的内容解释了一个理论上的模型。现代 JavaScript 引擎着重实现和优化了描述的几个语义。 运行时 下图是 JavaScript 运行时的可视化描述: 从图中可以看出,其主要包含了栈、堆、队列等数据结构。 栈 用于函数执行的「调用栈」,英文名为「call stack」。 function foo( b ) { var a = 10;​ return a + b + 11;}​funct

  • 问题内容: 我有一些我想在JS中做的资源密集型任务。对于这个问题,让我们假设它们是一些繁重的计算,而不是系统访问。现在,我想同时运行任务A,B和C,并在完成后执行一些功能D。 该异步库为此提供了一个很好的脚手架: 如果我正在做的只是计算,那么它将仍然同步运行(除非库将任务本身放在不同的线程上,我希望情况并非如此)。我如何使它实际上是平行的?异步代码通常不阻止调用者的事情是什么(使用NodeJS时)

  • 问题内容: Node.JS v0.11.3声称支持带有标志的ECMAScript 6模块。 我尝试了各种示例,例如以下示例。 使模块在Node.JS中工作的语法是什么? 问题答案: V8中的模块实现不完整。与–harmony- modules一起启用时,具有解析支持,但对实际功能的支持被暂停。这样做的原因是,有关ES6模块实际工作方式的规范尚在制定中,并且尚未完全确定。 Continuum中的实现

  • Go语言最吸引人的地方是它内建的并发支持。Go语言并发体系的理论是C.A.R Hoare在1978年提出的CSP(Communicating Sequential Process,通讯顺序进程)。CSP有着精确的数学模型,并实际应用在了Hoare参与设计的T9000通用计算机上。从NewSqueak、Alef、Limbo到现在的Go语言,对于对CSP有着20多年实战经验的Rob Pike来说,他更

  • 本文向大家介绍node.js调用C++开发的模块实例,包括了node.js调用C++开发的模块实例的使用技巧和注意事项,需要的朋友参考一下 如何用C++和node交互,在node的程序中,如果有大数据量的计算,处理起来比较慢,可以用C++来处理,然后通过回调(callback的形式),返回给node。先回顾一下正统的用 C++ 开发 native 模块的方法 这个模块用Node 写的话,是这样的: