Node.js操作需要同步的实例

时间:2012-12-08 02:00:16

标签: node.js

JavaScript是单线程的(除了Web worker并产生多个进程),最好不要等待长时间运行的操作,因为它会阻塞线程。但是,当我们看一下Github中的几个模块时,他们实际上使用了这些同步操作,大部分时间都在文件操作中。

我盯着糟糕的代码/练习吗?或者我是否真的需要在JavaScript中使用我不知道的同步操作?

3 个答案:

答案 0 :(得分:3)

你能发一个例子吗?你最有可能看到:

  • 实际上是异步的调用,例如fs.read。请注意,节点核心API中的所有同步调用都以单词“Sync”结尾,如fs.readSync
  • 同步代码,例如在应用程序开始接受网络请求之前运行的require('somemodule')

是的,如果您在响应HTTP请求时看到代码执行类似fs.readSync的操作,则这是错误的代码/实践,并且该同步操作发生时该应用程序将锁定。

答案 1 :(得分:2)

Node.js它不是单线程的,使用一个线程池但它们作为单个线程暴露给javascript层,否则将无法编写异步代码。任何I / O调用都会阻塞当前线程。

  

内部使用线程来伪造所有的异步性质   系统调用。 libuv也使用线程来允许你,应用程序,   以异步方式执行实际阻塞的任务   产生一个线程并在结束时收集结果。

http://nikhilm.github.com/uvbook/threads.html

Node.js决定包含同步函数以保持与其他常见语言的相似性,但不应该使用它们,永远不要,永远不要使用它们。

Node.js本质上是异步的,它是纯粹的javascript。 Javascript是回调的闭包的同义词。如果你想用Node.js编写同步代码,也许你应该尝试像python这样的另一种脚本语言。

有一个名为async的优秀模块可以减轻嵌套回调的痛苦。那么,我为什么要使用同步代码?愚蠢。如果我使用同步代码,我将失去Node提供给我的所有好处。唯一的例外是CLI应用程序,但同样,我更愿意异步编写所有代码。这不是很难。

答案 2 :(得分:0)

在某种程度上,必须进行同步操作。 Node.js将这些放在线程中,这样整个服务器就不会被阻塞。