如果异步/等待只是线程的包装,为什么异步/等待比线程更好?

如何解决如果异步/等待只是线程的包装,为什么异步/等待比线程更好?

这个话题在我心中已经很久了。

假设我们有一个典型的Web服务器,一个在Node.js中,另一个在Java(或其他任何带线程的语言)中。

为什么仅仅因为节点使用async / await,它的性能会比Java服务器更好(每秒处理更多基于IO /网络的请求)?不仅仅是在后台利用java / c#/ c ++使用的相同线程的语法糖吗?

解决方法

没有理由期望Node会比用Java编写的服务器更快。为什么会这样呢?

到目前为止(看来),这里的其他答案似乎是在解释JS中的异步编程与单线程同步操作相比的好处-显而易见,但不是问题。

每个人都同意的关键点是某些操作本来就很慢(例如:等待网络请求,等待磁盘/数据库访问),并且在进行此类操作时让CPU做其他事情非常有效。在应用程序中使用多个线程是一种行之有效的方法。但是,当然只有在提供线程的语言中才有可能。许多传统的服务器实现(使用Java,C,C ++等)在每个请求中使用一个线程(或等效地,在线程池中分配传入的请求)。这些线程可以阻止等待数据库的工作,这没关系,操作系统会将等待线程置于睡眠状态,同时让CPU在另一个线程上工作(处理另一个请求)。最终结果与通过Node获得的结果非常相似。

当然,JavaScript不会使线程可供程序员使用。但是,它具有通过JavaScript引擎调度请求并提供在请求完成时要调用的回调的概念。这就是整个系统的行为类似于传统的线程编程语言:用户代码可以说“先做这些事情,然后安排数据库访问,然后在结果可用时,在这里继续此[回调]代码”,然后等待数据库请求后,CPU将执行其他一些代码。您要避免的是,CPU闲置地等待,而还有其他工作在等待CPU有时间,而这两种方法(Java线程和JavaScript回调)都可以做到这一点。

最后,异步/等待(就像Promises一样)实际上只是语法糖,使编写基于回调的代码更容易。使用async / await的代码并不比直接使用回调的老式代码快,只是更漂亮,更不易出错。它也没有比(编写良好的)基于Java的服务器快。

Node.js之所以受欢迎,是因为在应用程序的客户端和服务器部分使用相同的语言很方便。从性能的角度来看,它不比传统的替代方法好,也并不差(或者至少没有很多;实际上,设计应用程序的效率更加重要)而不是用Java还是JavaScript来实现)。不要迷恋炒作:-)

,

异步(asyn / await)对于可能阻塞的活动(例如,当您的应用程序访问Web时)至关重要。对Web资源的访问有时很慢或延迟。如果在同步进程中阻止了此类活动,则整个应用程序必须等待。

在异步进程(线程)中,应用程序可以继续执行不依赖于Web资源的其他工作,直到潜在的阻止任务完成为止。

https://docs.microsoft.com/en-us/previous-versions/visualstudio/visual-studio-2012/hh191443(v=vs.110)?redirectedfrom=MSDN#threads尽管您应该了解线程与异步/等待编程之间的区别。

,

关于异步编程,可用性是关键。例如,一个请求可以分解为较小的任务,即获取内部结果,读取,写入,建立连接等...因此,一半时间浪费在等待相关任务上。异步模型利用这段时间来处理其他传入请求,同时保留回调函数,在队列中注册以保存状态并可以用于其他请求。因此,他们可以处理更多请求。

进一步了解如何处理请求:https://www.youtube.com/watch?v=cCOL7MC4Pl0

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-