javascript - 说 Node.js 和 JavaScript 提供基于事件循环的并发模型是不正确的吗?

标签 javascript node.js multithreading concurrency

我读到 Node.js 提供基于事件循环的并发性。但是并发不是意味着某些事情是同时发生的吗?事件循环之所以存在,是因为它处理代码位一个接一个地执行,而不是同时执行。

例如 Alexandru 在他的 Node.js 教程中写了这个 ( https://www.airpair.com/javascript/node-js-tutorial )

Node is single-threaded and uses a concurrency model based on an event loop. It is non-blocking, so it doesn't make the program wait, but instead it registers a callback and lets the program continue. This means it can handle concurrent operations without multiple threads of execution, so it can scale pretty well.

JavaScript 有没有并发?我的想法是只有 Web Worker 在 JavaScript 中启用并发,是否可以通过前端或后端的其他方式实现?

最佳答案

Userland 程序控制流在 JavaScript 中是单线程的。

如果并发是指两个任务在同一时间段内协同完成,那么是的,您可以通过实现自己的调度程序在 JavaScript 中实现这一点。

要利用 native 功能,您可以使用生成器来创建协同例程。

一些异步事件可以通过主机环境提供的 API 卸载(例如 setTimeout/window.fetch)。通过这种方式,宿主环境支持并发行为,但此功能不是 JavaScript 语言规范的一部分。

最后,语言规范定义了 Promise 行为,这可能会定义一些异步行为(我没有仔细阅读规范,我知道实现确实使用“微任务”)从而实现 native 并发。

但是您的用户态代码仍然是单线程的,并且延续只是安排在适当的时间在单线程上执行。

如果并行是并发的一个子集,其中运行的任务“更独立且不合作”,那么这可以通过 WebWorkers 和其他 JS 运行时 IIUC 的旋转来实现。

关于javascript - 说 Node.js 和 JavaScript 提供基于事件循环的并发模型是不正确的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40589988/

相关文章:

javascript - 你能解释一下这个 jQuery 方法吗?

macos - 已安装 karma 时未找到 karma 命令

java - 服务无法正常工作

c++ - 使用 2 个参数函数构造 std::thread 时出错

javascript - 如何使用 jquery 重置所有输入、li 和文本区域字段

javascript - 尝试使用isNaN方法清理输入,但它会使while循环崩溃

javascript - 设置 iframe 的媒体类型?

javascript - 如何从 node.js Express 发送 POST 请求?

javascript - Node.js 中的可变变量

java - Java 服务器中的执行程序池