javascript - 专业的Node库是如何实现异步执行的?

标签 javascript node.js multithreading asynchronous child-process

我花了一些时间查看 Node Bcrypt以及它们如何实现以下异步执行:

bcrypt.hash(myPlaintextPassword, saltRounds, function(err, hash) {
    // Store hash in your password DB.
});

他们正在使用异步回调执行计算量大的任务(盐生成)。他们如何在不阻塞主 Node IO 线程的情况下做到这一点?

我读过有关 process.nextTick() 的内容,但这似乎与 setTimeout() 类似,您在其中将 CPU 负载分配到一个线程(延迟 piper 的支付)。然后是 childProcess.fork(),但我认为他们没有使用它,因为我在 GitHub repo 中的任何地方都找不到它。 .

此外,您还有像 Monk 这样的库可以实现:

users.find({ name: 'Loki' }, '-bigdata').then(function () {
    // exclude bigdata field
})

在这个 repo 中的任何地方都没有出现 fork()以及。我认为,为了让 Monk 卸载这种处理,需要一个明确的进程分支而不是某种递归异步回调。

我正在尝试在我的应用程序中实现这种异步操作,但想了解专业人员是如何做的。有谁知道要做到这一点?

最佳答案

node.bcrypt 使用 Node-GYP将编译后的 C++ 代码(参见 /src/ directory)连接到异步 Node 函数的绑定(bind)。

所以我相信当 .hash 函数被调用时,Node 运行时将包含预编译二进制可执行文件中定义的函数,并在另一个线程上运行任何需要的计算。

monk 另一方面,取决于 mongodb (NPM) (GitHub) , 这取决于 mongodb-core (NPM) (GitHub) ,它使用 Node 的 net 模块创建一个异步 TCP 客户端来与 MongoDB 服务器进程对话。

关于javascript - 专业的Node库是如何实现异步执行的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308389/

相关文章:

javascript - 将参数传递给返回链中的 Promise 的函数

Java多线程向数据库插入百万条记录

c++ - 计算机如何将操作从一个线程切换到另一个线程

java - 如何正确处理Threads的输出? java

node.js - 当后端位于 Docker 容器中时,SvelteKit SSR fetch()

javascript - 为什么 AngularJS 从搜索栏中删除我的部分 URL

javascript - 在 html 表格的列中选择文本

javascript - Bootstrap CSS/Javascript 仅适用于轮播

node.js - 无法通过 nginx 连接到 socket.io

javascript - 在自定义钩子(Hook)中测试 fetch.catch