首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs中的并发模型

nodejs中的并发模型
EN

Stack Overflow用户
提问于 2011-03-01 18:54:43
回答 3查看 19.5K关注 0票数 30

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

特别是,ii++是原子的吗?在Java1.5、Java1.4、C语言中,ii是否表现得像volatile一样,或者根本不是呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-03 15:18:34

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

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

代码语言:javascript
复制
for (var i=0 ; i >= 0 ; i++) {}

无论你注册了多少个I/O回调,定时器设置为关闭,或者套接字等待读取,都无关紧要。在V8从那个无限循环返回之前,node不会再做任何工作。

这就是在node中编程如此出色的部分原因。您永远不必担心锁定问题。没有竞争条件或临界区。只有一个线程可以运行您的JavaScript代码。

票数 41
EN

Stack Overflow用户

发布于 2011-03-01 18:58:06

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

票数 14
EN

Stack Overflow用户

发布于 2011-03-03 08:45:08

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5153492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档