为什么 "worker_threads" 当我们有默认工作池时?

Why "worker_threads" when we have default worker pool?

我清楚集群方法,因为它部署了不同的整个流程。我想专业程序员出于某种充分的理由制作了 "worker_threads" 库......但为了我的理解,我仍然需要明确这一点:

在正常的单线程进程中事件循环线程借助默认工作池来卸载其繁重的I/O 任务,所以主线程没有被阻塞。

同时,用户定义的 "worker threads" 将出于同样的原因与它们自己的事件循环和 NodeJS 实例一起使用。

生成这些事件循环和 Nodejs 实例的意义何在,因为它们不是瓶颈,因为 libuv 旨在设法生成工作人员。

这是否意味着默认的工作池可能不够用?我是说数量问题还是概念问题?

Nodejs中有两种操作(调用)阻塞非阻塞

非阻塞

Nodejs 使用 Libuv 进行 IO 非阻塞操作。网络、文件和 DNS IO 操作 运行 由 Libuv 异步进行。 Nodejs 使用以下方案:

只要有可能,Node.js就会使用异步系统API,但在它们不存在的地方,Libuv的线程池用于基于同步系统API创建异步节点API。 Node.js 使用线程池的 API 是:

  • 所有 fs API,除了文件观察器 API 和那些:

  • 显式同步异步加密 API,例如 crypto.pbkdf2(), crypto.scrypt(), crypto.randomBytes(), crypto.randomFill(), crypto.generateKeyPair()

  • dns.lookup() 所有 zlib *API,除了那些明确同步的。

所以我们无法直接访问 Libuv 线程池。我们可以使用 C++ add-ons.

定义我们自己对线程池的使用

阻止调用

Nodejs 在主线程中执行阻塞代码。 fs.readfileSync()、压缩算法、加密数据、调整图像大小、为大范围计算素数是分块操作的一些示例。 Nodejs 的黄金法则永远不会阻塞事件循环(主线程)。我们可以通过使用 cluster 模块或 child-process 模块创建子进程来异步执行这些操作。但是,就 OS 资源而言,创建子进程是一项繁重的任务,这就是 worker-thread 诞生的原因。

使用 worker-thread 你可以在工作线程中执行阻塞 javascript 代码从而解除主线程的阻塞并且你可以通过消息传递与父线程(主线程)通信。与子进程相比,工作线程仍然是轻量级的。

在此处阅读更多内容:

https://nodesource.com/blog/worker-threads-nodejs

https://blog.insiderattack.net/deep-dive-into-worker-threads-in-node-js-e75e10546b11