异步http和同步http原理和差异

http异步请求方式 问题来了: 上一篇文章讲解了http的同步请求,如果需要在主线程中做多个http同步请求,必定阻塞耗费大量的时间,严重影响用户体验。那么问题来了,该如何解决呢? 解决方案: 此时我们可以将http同步请求改进为http异步请求,如下图所示: 该如何实现? 下面的任务就是该如何实现http的异步请求,这里有如下几个步骤: 1、将send与recv分离在两个线程,那么send就不... 阅读详情

开发服务器端程序时,一种常见的需求是,通过向另一个http服务器发送请求,获得数据。最常规的作法是使用同步http请求的方式,过程如下

这种方式简单好用,但是在高并发场景下有缺陷。在单线程环境下,程序发送http请求是串行的,也就是第一个请求未完成的情况下,第二个请求发不出去,就像一条单行车道,车子只能一辆一辆的过。 为此我们会引入多线程提高并发性,然而多线程对并发发送http请求的提升也是有限的,比如8个线程同时只能发送8个请求,假如每个请求从发送到得到结果的时间是1秒,那么8个线程每秒钟也只能发送8个请求,而线程不能无线多开,因此多线程并不能很好的解决客户端高并发发送请求的问题。

这听起来很扯淡,我们使用的服务器配置动不动就8核16G,为什么发送http请求的能力如此弱鸡,实际上这并不是服务器的锅,也不是java的锅,而是http工作模式的原因,在发送数据和得到数据的过程中有一个等待的过程,等待的过程并不消耗CPU,但是会让当前线程陷入等待,干不了别的事情。如果把多线程转换成线程池的模式,那么使用同步http时,在高并发场景下,线程池的队列中会堆积大量请求任务发不出去,而被请求的目标服务器,却还远没有达到瓶颈。

解决方案是使用异步http模型,我们知道nodejs因为天生的异步高性能而出名,实际上异步并不是nodejs的专利,任何主流的高级语言都支持,如 java、c++、.net等。

异步为什么快呢?因为异步http去除了同步http请求的等待过程,只保留了发送和处理得到数据的过程, 这听起来很扯蛋,发送http怎么可能没有等待呢?我在浏览器里访问网站不也要等一会才能打开页面吗? 实际上异步http请求并不是没有等待,只是把等待的这个步骤从当前线程转移到了别的地方,当前线程除了发送数据, 可以不干别的事情,而发送数据非常快,每一刻都是成千上万,可以充分利用计算机资源,而不是空等啥都干不了。

而http结果的响应,可以理解成以事件响应的形式触发,或者更通用的说法是回调函数的形式,所以发送数据和处理结果是两个不同的分支,也可以理解成处于不同的线程,互不干扰。

要较为深刻的理解异步http,还需要从TCP说起。TCP连接就像一根双向流通的管道,客户端从一端发送数据给服务器,服务器也从另一端发送数据给客户端。http本质上也是这种工作模式。客户端把一些http规范指定的必须数据项,包括请求头、请求主体、内容长度等信息打包成一个http请求数据包,通过TCP连接发送给服务器。服务器接受到http请求数据包,解码处理后,组装一个http响应包,发送给客户端。所以http本质上还是基于TCP的。

异步http就是这种底层工作模式的体现,客户端向服务器发送http请求,然后去做别的事情了,比如发另一个请求给服务器。至于服务器何时把响应数据包发送过来,客户端可以不管,至少在当前执行的上下文中可以不管,因为当服务器响应时,会有另外的线程被唤醒处理这个响应。

既然异步http更接近http的本质,性能也更高,那么为什么还会有同步http出现呢?而且通常还是使用http请求的默认模式。主要原因还是同步 http使用简单,易于理解,更符合人类正常思考问题的思维,也更容易让新手入门。

同步http只是将异步http进行了封装,当客户端发送一个http请求时,让当前线程进入等待,当结果响应了再让当前线程唤醒处理结果。这样整个http的过程变的简单了,但是却远离了tcp的本质,性能也更差劲了。

【UE5 C++】HTTP客户端异步请求API接口并解析响应的JSON 本文以请求网络/本地时间API为例,介绍如何实现HTTP异步请求。步骤: 一、 搭建异步蓝图节点框架; 二、异步蓝图节点嵌入到引擎的执行流程; 三、获取本地时间并异步返回; 四、获取网络时间并异步返回; 五、源码 阅读详情

相关推荐

一个Http异步请求的例子

一个Http异步请求的例子

异步http请求

何为异步http请求 首先搞清楚同步异步 同步异步是只两个操作流程以上来说的,同步就是做完一件事才能做另一件事, 比如对数据库的请求,接收操作,这是两个操作 同步就是发送sql语句了,当前进程阻塞等待数据库返回数据,这段时间不能做别的事情。 异步就是发送sql语句,当前进程不阻塞,继续执行下面的流程,当数据库返回数据了,通过异步事件通知主进程处理。 异步http请求就跟上面的差不多 如何用C实现异步http请求? 思路:通过epoll管理io事件。 每发送一个http请求,将socket fd加入epoll

gdut17的博客 1823

Windows 10/11下R与RStudio最新版安装避坑指南(含镜像加速配置)

本文提供了Windows 10/11系统下R与RStudio最新版的详细安装指南,包含镜像加速配置和常见问题解决方案。通过分步教程帮助用户避开安装陷阱,优化开发环境设置,特别适合国内用户快速搭建高效的数据分析平台。

weixin_29065959的博客 1005

Java发起同异步HTTP请求和处理数据

本文探讨了同步与异步的概念差异及其在Java HTTP请求中的应用。通过生活类比(接力跑vs齐跑)和编程实例,阐明了同步需顺序执行而异步可并发处理的本质。文章重点比较了Java中同步与异步HTTP请求的性能差异,测试数据显示异步方式在处理大批量请求时效率显著提升(如10万次请求从17分钟缩短至3分钟)。针对Java8环境,作者推荐使用CompletableFuture实现异步请求,并提供了完整的代码示例,包括请求头设置、时间参数处理和异步任务管理。文末强调异步编程能有效解决高并发场景下的性能瓶颈问题。

weixin_42077074的博客 4676

避坑指南:LISFLOOD-FP模型数据单位、参数文件与results文件夹结果解析全攻略

本文详细解析了LISFLOOD-FP洪水模拟模型的关键应用环节,包括数据单位校验、参数文件优化及结果文件解读与可视化。特别针对常见的单位混淆问题,提供了从DEM到边界条件的全面校验方法,并深入剖析了.par参数文件的配置技巧,帮助用户避免模型崩溃和结果失真。

weixin_42533622的博客 237

人工智能机器学习从入门到高级学习资料(含资料下载地址)

机器学习是一个技术含量较高的领域,高效学习需要多种途径相结合.以下是一些推荐的学习资源。首先介绍几个比较有用的社区,包含了丰富的学习资料

2401_86900375的博客 1647

Tornado异步原理详析

Tornado异步原理详析 Tornado是什么 Tornado是一个用Python编写的异步HTTP服务器,同时也是一个web开发框架. Tornado优秀的大并发处理能力得益于它的web server从底层开始就自己实现了一整套基于epoll的单线程异步架构 同步, 异步 编程差异 对于同步阻塞型Web服务器,我们打个比方,将它比作一间饭馆,而Web请求就是来这家饭馆里吃饭的客人. 假设饭店...

YiJie__ShuSheng的博客 1203

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2404

Pyodide 网络编程指南:掌握 pyodide.http 的 pyfetch 异步与 pyxhr 同步 HTTP 客户端

Pyodide 是一个基于 WebAssembly 的 Python 运行时,可在浏览器与 Node.js 中运行。由于其运行在浏览器的安全沙箱与 WebAssembly 环境内,传统 Python 网络库(如 `urllib`、`requests`)无法直接工作,因此 Pyodide 提供了专门的 `pyodide.http` 模块。本指南将围绕该模块的两大核心能力展开:基于 Fetch API

gitblog_00047的博客 230

Zemax实战:20×超高清变焦镜头设计全流程解析(从架构到制造)

本文详细解析了使用Zemax软件设计一款20倍变焦比、恒定F2.8光圈8K超高清镜头的全流程。从应对恒定光圈、宽光谱与8K解析力三大挑战的初始架构规划,到构建多重组态模型、分七阶段进行像差优化与公差分析,最终跨越制造鸿沟,为广播级影视与高精度工业检测应用提供了实战指南。

sun99的博客 551

【AI就业干货12】机器学习八股文速通:从损失函数到 XGBoost,一篇带走全部面试点

本文总结了机器学习面试的核心知识点,涵盖监督与非监督学习、线性模型、正则化、决策树、KNN/K-means、SVM、集成学习、梯度下降、评估指标、特征工程、降维、概率模型等内容。重点包括:损失函数选择(MSE/交叉熵)、正则化作用(L1稀疏/L2平滑)、决策树划分准则、集成学习方法(Bagging降方差/Boosting降偏差)、XGBoost优化等。提供了30秒速记口诀和XGBoost代码示例,帮助快速掌握面试要点。全文采用公式+代码+口诀的形式,系统梳理了机器学习从理论到实践的常见考点。

m0_51738372的博客 731

Go Web开发知识点:TCP和UDP对比 网络攻击解释 阻塞调用和同步调用 http和https的区别 session和cookie

TCP协议和UDP协议的对比?TCP协议的优点:可靠稳定TCP在传输数据之前,会有三次握手来建立连接TCP在传输数据时,有确认、窗口、重传、拥塞控制机制TCP在传输数据完成后,会断开连接用来节省系统资

王中阳讲编程 274

[ vulhub漏洞复现篇 ] ActiveMQ反序列化漏洞复现(CVE-2015-5254)

Apache ActiveMQ是美国阿帕奇(Apache)软件基金会所研发的一套开源的消息中间件,它支持Java消息服务、集群、Spring Framework等。由于ActiveMQ是一个纯Java程序,因此只需要操作系统支持Java虚拟机,ActiveMQ便可执行。Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞,该漏洞源于程序没有限制可在代理中序列化的类。......

qq_51577576的博客 4444

【python_并发】requests vs aiohttp vs httpx:HTTP客户端深度对比与实战

单次请求:简单脚本、配置文件读取非IO密集:计算密集型任务兼容旧代码:迁移成本考虑调试阶段:同步代码更容易调试# 简单脚本用 requests 最方便场景同步耗时异步耗时提升10个请求(串行)~5秒~0.5秒10倍100个请求(并发10)~50秒~5秒10倍单次请求~0.5秒~0.5秒无差异结论单次请求:同步和异步性能相同批量请求:异步性能提升N倍(N为并发数)异步的优势在于等待IO时可以做其他事,不是单次请求更快。

hello world 7802

基于单片机的智能体重秤设计与嵌入式程序实现

智能体重秤的基本功能是测量用户的体重,并将数据通过无线方式传输到终端设备(如智能手机、电脑或云平台)进行管理。体重测量:实时测量用户体重,并进行数据存储。BMI(体质指数)计算:基于体重和身高计算BMI值,帮助用户了解健康状况。多用户管理:通过蓝牙或Wi-Fi技术支持多用户体重数据记录。健康数据分析:结合历史数据分析体重变化趋势。语音播报:通过语音播报用户体重,便于老人或视力不便的人士使用。数据同步:通过App或云平台同步数据,进行长期健康监控。

2201_76125393的博客 1755

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

网络编程

文章目录ISO七层网络模型五层网络模型TCP/IP分层模型TCP与UDP的区别HTTP与HTTPS的区别长连接与短连接websocket与HTTP与socketPUT和POST的区别?同步与异步,阻塞与非阻塞 ISO七层网络模型 五层网络模型 TCP/IP分层模型 TCP与UDP的区别 HTTP与HTTPS的区别 http分为:请求行(请求方法、URI、HTTP版本)、请求头(Date、C...

Zz_ayin的博客 473

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Python网络编程实战:从原理到实践

网络编程是构建分布式系统和网络应用的基础。Python提供了丰富的网络编程库,从底层的socket到高层的asyncio和HTTP框架。本文将介绍Python网络编程的核心概念和实践技巧。

lady_mumu的博客 4137

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

从同步阻塞到异步并发:Python asyncio实战解析

在软件开发中,I/O密集型任务(如网络请求、文件读写)常常因同步阻塞导致CPU利用率低下,程序耗时成倍增加。理解阻塞与非阻塞模型,是利用事件循环提升并发性能的关键。事件循环作为异步编程的核心机制,允许单线程在等待I/O时切换执行其他任务,从而将等待时间重叠,大幅缩短总耗时。Python的asyncio库正是基于此原理,为开发者提供了协程与异步I/O的优雅实现。在处理批量下载、高并发Web请求等场景时,合理使用asyncio可将效率提升数倍甚至一个数量级。本文通过同步与异步代码的对比实验,剖析CPU空闲根源,

weixin_31315567的博客 205

【性能优化必备】libhv网络库HTTP超时机制全解析:从原理到实战避坑指南

你是否曾被线上服务偶发的"请求卡死"问题困扰?是否遇到过因第三方API响应缓慢导致整个系统雪崩的情况?作为C/C++开发者,在处理高并发网络请求时,一个健壮的超时控制机制能让你在复杂网络环境中化险为夷。本文将深入剖析libhv(一个比libevent/libuv/asio更易用的网络库)的HTTP超时控制实现,带你掌握从连接超时、请求超时到异步回调超时的全场景解决方案,让你的网络应用从此告别"僵尸...

gitblog_01427的博客 314

AJAX请求

Ajax全名 Asynchronous JavaScript and XML,异步的JS和XML,是一种新技术,但是它并不是一种编程语言,而是一种新方法。 Ajax有什么用呢? 在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。 也就是说,我们可以不用重新加载页面,得到额外的数据。 没有Ajax的世界: 传统的没有用Ajax的网页中,想要更新内容或者提交一个表单,就要重新加载页...

qq_39073792的博客 269

Runtime Async - 步入高性能异步时代

awaitfn main() { // 构建自定义运行时:多线程 + 高并发模式 let runtime = Builder::new_multi_thread() .worker_threads(8) // 设置 8 个工作线程 .max_blocking_threads(100) // 允许最多 100 个阻塞线程(用于 CPU 密集型操作) .enable_io() // 启用 I/O 驱动 .enable_time() // 启用定时器 .build() .expect("运行时创建失败");

lh25VaEOf的博客 182

C++秋招(暑期实习)准备---10--- 项目2 WebServer

基础知识: 1:浅谈同步与异步: 同步就是一个进程在执行某个请求时候,若该请求需要一段时间才能返回信息,那么这个进程就会一直等待下去,知道收到返回信息才继续执行。 异步就是进程不需要一直等待下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时,系统会通知进程处理,这样可以提高效率。、 同步I/O模型要求用户代码自行执行I/O操作(将数据从内核缓冲区读入用户缓冲区,或者相反) 异步I/O模型则由内核来执行I/O操作,数据在内核缓冲区和用户缓冲区之间的移动是由内核在后台完成的。半同步/半异

imfengyewuqing的博客 724

0623面试题

Promise构造函数是同步执行还是异步执行,那么 then 方法呢? Promise构造函数是同步执行的then方法是异步执行的 下面的输出结果是多少? const promise = new Promise((resolve, reject) => { console.log(1); resolve(); console.log(2); }) promise.then(() => { console.log(3); }) console.log(4);

月夜狼群的博客 147

七、网络通信

1. http是无状态通信,http的请求方式有哪些,可以自己定义新的请求方式么。 2. socket通信,以及长连接,分包,连接异常断开的处理。 3. socket通信模型的使用,AIO和NIO。 4. socket框架netty的使用,以及NIO的实现原理,为什么是异步非阻塞。 5. 同步和异步,阻塞和非阻塞。 6. OSI七层模型,包括TCP,IP的一些基本知识 7. http...

stupider0623的博客 167

Node.js八股

摘自互联网

weixin_70755082的博客 577

从零看懂计算机(十三):网络调用——Socket 与 HTTP,程序开口说话的现场

本文为《从零看懂计算机》第13篇,系统讲解网络编程核心——Socket,揭示其作为程序“网络大门”的本质。通过服务端四步、客户端两步操作,阐明TCP三次握手与流式读写机制,实现第12篇“流”概念的跨机器延伸。对比TCP(挂号信)与UDP(广播),区分同步(打电话)与异步(发微信)等待模式,厘清四大关键概念。深入拆解HTTP报文结构,完整还原“输入网址到显示网页”的十步旅程,串联前12篇知识点。附动手实验:回声服务器与并发压测,实证多线程在IO密集场景下绕开GIL的效能优势,强调实测重要性,杜绝网络性能误判。

qq_33784417的博客 343
上一篇: RESTful API介绍
下一篇: Niginx介绍和安装使用(附面试题)
涵冰...
博客等级 码龄4年 2438粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涵冰...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值