console.log是原子的吗?

时间:2016-08-10 03:09:57

标签: javascript node.js multithreading parallel-processing

Python中的print语句不是线程安全的。同时在Node.js中使用console.log是否安全?

如果是这样,那么它也是交错安全的吗?也就是说,如果多个(甚至数百个)回调写入控制台,我可以确定输出不会被破坏或交错吗?

查看源代码,似乎Node.js将并发尝试写入流(here)。另一方面,console.log的{​​{3}}。如果console.log包裹printf,则可以在POSIX计算机(substitution flags come from printf(3))上交错输出。

请在回答此问题时告诉我Node.js中as shown here的位置。

编辑:如果可以同时写入流,那么为什么async ._write(chunk, encoding, cb) is implemented存在?

3 个答案:

答案 0 :(得分:4)

node.js中的所有内容基本上都是“原子的”。那是因为node.js是单线程的 - 没有代码可以被中断。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

根据我在 Node.js 控制台上看到的内容,它不是“交错安全”的。

我可以看到我的控制台输出有时被“破坏或交错”。不总是。当我运行我的程序时,我可能每 5 次看到多个日志语句的交错输出。

这当然取决于您的 Node.js 版本和运行它的操作系统。作为记录,我的 Node.js 版本是 v12.13.0,操作系统是 Windows 10.0.19042。