JavaScript是单线程的(除了Web worker并产生多个进程),最好不要等待长时间运行的操作,因为它会阻塞线程。但是,当我们看一下Github中的几个模块时,他们实际上使用了这些同步操作,大部分时间都在文件操作中。
我盯着糟糕的代码/练习吗?或者我是否真的需要在JavaScript中使用我不知道的同步操作?
答案 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将这些放在线程中,这样整个服务器就不会被阻塞。