-1

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

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

4

3 回答 3

3

你可以发布一个例子吗?你最有可能在看:

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

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

于 2012-12-08T02:30:02.950 回答
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 应用程序,但同样,我更喜欢异步编写所有代码。这并不难。

于 2012-12-08T15:27:40.803 回答
0

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

于 2012-12-08T02:18:24.893 回答