JavaScript 是单线程的(除了 web worker 和产生多个进程),最好不要等待长时间运行的操作,因为它会阻塞线程。但是,在查看 Github 中的几个模块时,它们实际上使用了这些同步操作,大部分时间用于文件操作。
我在盯着糟糕的代码/实践吗?或者我不知道 JavaScript 中是否真的需要同步操作?
JavaScript 是单线程的(除了 web worker 和产生多个进程),最好不要等待长时间运行的操作,因为它会阻塞线程。但是,在查看 Github 中的几个模块时,它们实际上使用了这些同步操作,大部分时间用于文件操作。
我在盯着糟糕的代码/实践吗?或者我不知道 JavaScript 中是否真的需要同步操作?
你可以发布一个例子吗?你最有可能在看:
fs.read
. 请注意,节点核心 API 中的所有同步调用都以单词“Sync”结尾,如fs.readSync
.require('somemodule')
在应用程序开始接受网络请求之前运行的代码是的,如果您看到代码fs.readSync
在响应 HTTP 请求时执行类似操作,那是错误的代码/做法,并且该应用程序将在同步操作发生时锁定。
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 应用程序,但同样,我更喜欢异步编写所有代码。这并不难。
在某种程度上,必须发生同步操作。Node.js 将它们放在线程中,这样整个服务器就不会被阻塞。