node.js - NodeJS中的多线程和异步有什么区别
问题描述
NodeJs 在最新更新中添加了多线程功能。
我想通过简单的例子来了解多线程和异步有什么区别?在哪些情况下我们应该使用多线程而不是异步?
解决方案
首先要了解的是计算机的不同部分以不同的速度工作。磁盘、网络等...
因此,如果您注意到异步代码似乎只处理网络或文件的大量内容,我们称之为 io.
嗯不错。
现在让我们考虑一下,您的代码正在运行并且您需要读取一个文件。在 CPU 时间。cpu 说,这是“1000 年”。嘿,当数据可用时,你告诉我。我去做一些其他的事情。
然后磁盘回来了,就像嘿我得到了你想要的数据。cpu之类的?数据哦,我正在“等待”的东西。
您可以看到这如何更有效。
现在,如果您没有获取数据怎么办。如果你的 cpu 需要做不止一件事怎么办。
按照这个,早上你可能会一边倒果汁一边做三明治。两者都很难做到吗?
但是您可以在等待鸡蛋煮熟的同时轻松倒入果汁。
线程...线程是为了得到更多的人。我需要做更多的任务,比如缩小图像的大小,我等不及图像缩小了。我需要主动缩小图像,但我需要回应其他人,我需要缩小多个图像,我不能一次只做一个。
所以现在你明白了这个概念,让我来解释一下这该死的东西。
异步代码创建了一个只等待 io 的哑线程,例如磁盘或网络。它仍然是一个线程,但代码可以很好地为您处理它。它为您解决了一堆复杂的工作。您只需编写等待和异步。
线程通常你必须管理更多。这样想吧。
从磁盘读取,从网络读取......它们是相当明显的东西,您可以确保围绕它创建一个 API。但是 cpu 工作,一个 cpu 可以做无限的事情。线程通常涉及更多的手动工作。
最后一个线程只能做一件事。用一只手倒入你的橙汁和黄油三明治。很难吧?可能需要线程,额外的手。
现在煮鸡蛋,用一只手切一些西瓜。您可以看到如何等待某些事情完成并去做其他事情。
去..你现在是一个男人!
推荐阅读
- javascript - 在 JS 派生类的构造函数中使用 super() 感到困惑
- java - Java 独占全屏模式不断抛出“无效显示模式”
- c# - 重用具有 DbContext 层次结构的 ASP.NET 控制器和服务
- oracle - 如何在从另一个用户 Oracle Database 19c 创建“SYS.CDEF$”视图时修复“ORA-01031”
- android - 如何修复 React Native 中的内存泄漏?
- python - Python:Lambda 表达式
- node.js - Node.js 中 Mac 上的应用程序支持路径
- haskell - 霍夫曼树解码
- ios - 尝试将电子邮件联系人添加到 Sendgrid
- python - 如何用 Django 运行这个 python 脚本?