【问题标题】:How do professional Node libraries achieve asynchronous execution?专业的 Node 库是如何实现异步执行的?
【发布时间】:2016-09-03 23:53:34
【问题描述】:

我花了一些时间研究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 卸载这种处理,需要一个明确的进程分支,而不是某种递归异步回调。

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

【问题讨论】:

    标签: javascript node.js multithreading asynchronous child-process


    【解决方案1】:

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

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

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

    【讨论】:

    • 如果您对 Node 的内部工作有更多了解,我很想亲自了解更多!
    • 异步处理发生在哪里,是在 C 中还是在 JS 中?
    • 我相信它在 Node 运行时内部。 node.bcrypt 使用 Nan abstraction 辅助库与 V8 进行交互。
    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 2015-07-24
    • 2022-07-13
    • 1970-01-01
    • 2014-11-23
    • 2010-10-11
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多