Is console.log atomic?
Python中的print语句不是线程安全的。在Node.js中同时使用console.log是否安全?
如果是这样,那么它也是交错安全的吗?也就是说,如果多个(甚至数百个)回调写入控制台,我可以确定输出不会被破坏或交错吗?
看看源代码,似乎Node.js将并发尝试写入队列(在此处)排队。另一方面,console.log的替换标志来自printf(3)。如果console.logpackage在printf周围,则可以交错POSIX机器上的输出(如下所示)。
在回答此问题时,请告诉我async ._write(chunk, encoding, cb)在Node.js内部实现的位置。
编辑:如果可以同时写入流很好,那么为什么这个np??m包存在?
- Node.js是单线程的。回调可能起源于不同的线程,但是一旦它们进入主线程,则没有任何并发??事件。
node.js中的所有内容基本上都是"原子的"。那是因为node.js是单线程的,所以任何代码都不能被中断。
- 注意;在浏览器中console.log对象评估存在延迟的问题。见stackoverflow.com/questions/4057440/…。但是,不应该影响node.js应用程序。
-
有人可以解释一下如何将Node设置为单线程并且仍然处于回调地狱吗?我的意思是..您的意思是,即使可能正在进行2000个回调,一次也只能执行其中一个,直到它完成或被非CPU绑定的操作阻止?
-
@andrerpena:是的,任何时候都只能执行其中之一,但是所有2000都可以并行等待。这就是并发的意思-代码可以并行执行而无需执行。并发!=并行性。
-
好的,但是"原子"是按字符写的吗?通过换行符?另外,请参阅自您回答此问题以来我所做的修改。我从理论上理解您的意思,但我需要更深入的解释。
-
@andrerpena:这是我之前写过的两个解释该体系结构的答案:stackoverflow.com/questions/19616477/…,stackoverflow.com/questions/29883525/…
-
@Coder:不,atomic表示console.log()函数本身的执行,包括对printf()的内部调用等。js中的任何函数实际上都不直接写到stdout。相反,它会将事件排入事件循环(找到的代码)中。因此atomic用"消息"来写。
-
@Coder:请注意,node.js的所有内容都使用一个线程:控制台,套接字等。唯一的例外是磁盘I / O,然后节点在每个文件中使用一个线程,这仍然意味着I / O从技术上讲是线程安全的。
-
@slebetman:如果您将答案修改为包含NPM软件包的来源以及源代码中实现异步_write功能的地方,我可以接受您的回答。
-
NPM软件包用于处理两个程序写入同一文件的情况。他的解决方案是写入一个临时文件,然后将其复制到位(在Unix上重命名是原子的:stackoverflow.com/questions/18706419/…)。这是为了处理节点进程与另一个节点进程或C程序或Ruby进程或Perl进程等之间存在竞争条件的情况。
nodejs的事件循环是单线程,但是nodejs的所有异步调用都是多线程的,它在后台使用libuv,libuv是使用多线程的库。
链接:
https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c
基于我在Node.js控制台上看到的内容,它不是" interleave-safe \\"。
我可以看到我的控制台输出有时是"断断续续的"或"交错的"。不总是。当我运行程序时,可能每隔5次就会看到来自多个日志语句的交错输出。
这当然取决于您的Node.js版本和运行它的操作系统。作为记录,我的Node.js版本是v12.13.0,操作系统是Windows 10.0.19042。