精华内容
下载资源
问答
  • flask是如何处理多个访问请求的?

    千次阅读 2020-12-20 02:22:39
    假设服务器跑着这样段简单的flask代码:app = Flask()@app.route('/')def index():return render_temple('index.html')这时候服务器来了两访问请求,这两个请求都被路由到@app.route(‘/’).请问flask是如何同时...

    假设服务器跑着这样一段简单的flask代码:

    app = Flask()

    @app.route('/')

    def index():

    return render_temple('index.html')

    这时候服务器来了两个访问请求,这两个请求都被路由到@app.route(‘/’).

    请问flask是如何同时处理这两个请求的 ? 如果我的代码没有实现任何并发功能,flask会自动帮我处理并发请求吗 ? 如果有Nginx这类HTTP服务器,情况又是怎样?

    希望各位能指导下,给个解答或者指明下学习方向都行 ! 万分感谢 !

    这段程序只是一个APP服务的一个路由。你的APP服务又被用WSGI接入到HTTP服务器,就是你说的nginx。这个问题跟nginx无关,因为这里它只是一个通道。跟Flask也无关,因为它只是负责根据Request产生Response。有关的就是WSGI server。通常来讲WSGI server是通过进程(pre-fork)来并发的。这样并发就取决与进程数。如果WSGI server用了gevent, eventlet等 green thread技术,就可以支持更多并发。

    解答你的问题

    如果使用下面的启动方式,你的代码没有实现任何并发功能,flask 不会自动帮你处理并发请求;

    python app.py

    可以通过加一个 time.sleep 做测试, 比如下面代码:

    import time

    app = Flask()

    @app.route('/')

    def index():

    time.sleep(5) # 单位秒

    return render_temple('index.html')

    多线程

    多线程的话,可以使用 gunicorn 来启动。 -w 后面跟的参数就是代表进程数量,同样,可以通过 time.sleep 测试。

    gunicorn app -w 2 -b :8000

    异步

    可以使用 gevent 来处理。

    Python 3.5 提供了新的异步 API(介绍)。

    如果是单个worker 是不会同时处理的 只会阻塞住(可能用词不当),用nginx 或者supervisor 是因为可以设置多个worker 同时处理请求, 我是这么理解的

    要看你是怎么部署这个程序的,如果是采用

    Flask

    默认的Debug Server,那就是单线程的,两个请求会被“串行”地处理,即 @liuxiaoxiaochen 说的第二个请求会被“阻塞”,直到第一个请求执行完才会执行。

    如果以多线程方式部署的话,两个请求就能被同时处理的。

    可以试试 gevent/gunicorn。用异步。

    http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00140262673295076f525af00734a8e924c5fc6ff5b6091000

    展开全文
  • 02 网络面经:一个TCP连接可以发送多少个HTTP请求

    千次阅读 多人点赞 2021-08-25 09:27:13
    一个TCP连接可以发送多少个HTTP请求?就这这个问题,我们聊聊TCP、HTTP以及浏览器之间的关系和对请求处理的优化。 TCP与HTTP的渊源 我们知道TCP协议对应于传输层,HTTP协议对应于应用层。WEB项目中,HTTP协议是建立...

    一个TCP连接可以发送多少个HTTP请求?就这这个问题,我们聊聊TCP、HTTP以及浏览器之间的关系和对请求处理的优化。

    TCP与HTTP的渊源

    我们知道TCP协议对应于传输层,HTTP协议对应于应用层。WEB项目中,HTTP协议是建立在TCP的基础上的。

    最初浏览器从服务器加载一个网页,会发起一个HTTP请求,这时需要先建立一个TCP连接。当本次数据请求完毕之后,会立刻断开TCP连接。

    但随着时间的推理,HTML网页内容越来越复杂,不仅有内容,还有JS、CSS和图片资源,每个资源的请求都建立一次TCP连接,效率就会很低。

    这时,Keep-Alive就被提出用来了,专门用于解决效率低的问题。

    本文关于TCP连接能够发送多少个HTTP请求,本质上就是围绕着解决通信的低效问题的。

    下面我们通过几个常见的面试问题,来逐步揭开这其中包含的知识点。

    问题一:浏览器建立TCP连接之后,完成一次HTTP请求,是否会断开?

    HTTP协议Header中的Connection属性决定了连接是否持久,不同HTTP协议版本有所不同。

    HTTP/1.0中Connection默认为close,即每次请求都会重新建立和断开TCP连接。缺点:建立和断开TCP连接,代价过大。

    HTTP/1.1中Connection默认为keep-alive,即连接可以复用,不用每次都重新建立和断开TCP连接。超时之后没有连接则主动断开。可以通过声明Connection为close进行关闭。

    优点:TCP连接可被重复利用,减少建立连接的损耗,SSL的开销也可以避免。刷新页面时也可以复用,从而不再建立SSL连接等。

    结论:默认情况下(HTTP/1.1)建立TCP连接不会断开,只有在请求报头中声明Connection: close才会请求完成之后关闭连接。不断开的最终目的是减少建立连接所导致的性能损耗。

    问题二:一个TCP连接可以对应几个HTTP请求?

    如果Connection为close,则一个TCP连接只对应一个HTTP请求。

    如果Connection为Keep-alive,则一个TCP连接可对应一个到多个HTTP请求。

    问题三:一个TCP连接中,可以同时发送多个HTTP请求吗?

    HTTP/1.1中单个TCP连接在同一时刻只能处理一个请求。HTTP/1.1在RFC 2616中规定了Pipelining来解决这个问题,但浏览器默认是关闭的。

    RFC 2616中规定:一个支持持久连接的客户端可以在一个连接中发送多个请求(不需要等待任意请求的响应)。收到请求的服务器必须按照请求收到的顺序发送响应。

    Pipelining本身存在一些问题,比如代理服务器不能正确处理HTTP Pipelining、Head-of-line Blocking连接头阻塞(首个请求耗时过长,阻塞其他请求)。所以,浏览器默认关闭该功能。

    HTTP/2.0提供了多路复用技术Multiplexing,一个TCP可以并发多个HTTP请求(理论无上限,但是一般浏览器会有TCP并发数的限制)。

    HTTP/1.1中为了提升性能,通常会采用连接复用和同时建立多个TCP连接的方式提升性能。

    结论:HTTP/1.1中存在Pipelining技术支持一个连接发送多个请求,但存在弊端,浏览器默认关闭。HTTP/2.0中通过多路复用技术支持一个TCP连接中并发请求HTTP。

    问题四:浏览器对同一Host建立TCP连接的数量有没限制?

    不同浏览器限制不同,比如Chrome最多允许同一个Host可建立6个TCP连接。

    如果服务器只支持HTTP/1.1,浏览器会采用在同一个Host下建立多个TCP连接来进行效率提升。如果是基于HTTPS传输,在SSL握手之后,还会尝试协商是否可以采用HTTP/2.0的Multiplexing功能。

    问题五:keep-alive使用场景及优缺点

    开启keep-alive对内存要求高,关闭keep-alive对CPU要求高;如果内存和CPU都足够,开启和关闭keep-alive对性能影响不大;如果考虑服务器压力,如果是静态页面,大量的调用js或者图片的话,建议开启keep-alive;如果是动态网页,建议关闭keep-alive。

    注意事项:如果需要使用keep-alive功能,服务器端如果使用nginx中keepalive_timeout值要大于0。

    小结

    通过上面的整体分析,我们不仅了解了TCP与HTTP之间的关系,还明确了现代浏览器基于不同的HTTP协议所作出的网络层面优化。而HTTP2/0的多路复用机制还是一些高性能框架的基础,比如gRPC的实现。

    博主简介:《SpringBoot技术内幕》技术图书作者,酷爱钻研技术,写技术干货文章。

    公众号:「程序新视界」,博主的公众号,欢迎关注~

    技术交流:请联系博主微信号:zhuan2quan


    微信公众号:程序新视界


    程序新视界”,一个100%技术干货的公众号


    展开全文
  • 在实际开发中,碰到参数不同,接口相同,需要发送多个请求拿到数据后统一做处理的情况,例如:模块总退出功能,点击退出按钮,调用多个模块的退出接口,全部成功后退出到登录页; 代码 //数组+异步请求 const datas ...

    前言

    在实际开发中,碰到参数不同,接口相同,需要发送多个请求拿到数据后统一做处理的情况,例如:模块总退出功能,点击退出按钮,调用多个模块的退出接口,全部成功后退出到登录页;

    代码

    //数组+异步请求
    const datas = ['小明','小红','小李']
    async function login(array){
    	const promise = array.map(i=>{
    		const url = 'http://197.1.1.1/login?user='+i
    		return new Promise((resolve,reject) => {
    			axios.get(url).then(res=>resolve(res)).catch(err=>reject(err))
    		})) 
    	})
    	const {data}  = await Promise.all(promise)
    	if(data)console.log(data) //结果参数的和
    }
    
    
    //对象数组+加模拟异步请求
    const datas = [{name:'小明'},{name:'小红'},{name:'小李'}]
    async function login(array){
    	const promise = array.map(i=>{
    		const url = 'http://197.1.1.1/login?user='+i.name
    		return new Promise((resolve,reject) => {
    			 setTimeout(resolve, 0, url);
    		})
    	})
    	const res  = await Promise.all(promise)
    	if(res) console.log(res) 
    	//> Array ["http://197.1.1.1/login?user=小明", "http://197.1.1.1/login?user=小红", "http://197.1.1.1/login?user=小李"]
    }
    
     login(datas)
    

    tips

    • Promise.all(promise),all方法中的参数是一个由多个promise组成的集合;
    • async/await是异步请求的语法糖;
    • new Promise新建多个promise,(resolve,reject)是获取结果或者失败结果的返回;
    • axios是在vue中使用异步请求的方法,同理可以使用jq.Ajax或者原生Ajax去请求参数;
    • map是es6中的循环处理方法,返回一个由内部return的新数组;

    结语

    以上就完成了前端js使用promise循环发送多个异步请求的功能!
    over~ 有问题留言
    如果本文对你有帮助的话,请不要忘记给我一键三连打call哦~o( ̄▽ ̄)do

    展开全文
  • 在实际开发中,前端除了请求后端服务器还可能会请求文件服务器等,他们的地址是不一样的,例如后台地址是localhost:8001,文件服务器是localhost:8002,这里我使用vue-admin-template后台模板来举例如何配置。...

    在实际开发中,前端除了请求后端服务器还可能会请求文件服务器等,他们的地址是不一样的,例如后台地址是localhost:8001,文件服务器是localhost:8002,这里我使用vue-admin-template后台模板来举例如何配置。

    配置跨域代理

    在vue中使用proxy进行跨域的原理是:将域名发送给本地的服务器(启动vue项目的服务,loclahost:8080),再由本地的服务器去请求真正的服务器。

    首先,配置好前端跨域代理,在vue.config.js中

     其中process.env.VUE_APP_BASE_API代表.env.development文件中的VUE_APP_BASE_API

    我们可以从request.js中看到请求地址会是VUE_APP_BASE_API(/dev-api)+请求路径。

     我们验证一下:

     可以看到此时请求地址都是http://localhost:9528/dev-api/+请求路径,这样前端跨域就配置好了,通过前端代理,实际的请求地址是http://localhost:8001/+请求路径。

     这样文章开头的问题就产生了,所有请求都是默认代理请求的是localhost:8001,当我们使用文件上传或者请求别的服务,如果文件服务器地址是localhost:8002,那我们就不会请求到,那么该如何配置呢?

    通俗的说就是把/dev-api之前的都换成了localhost:8002,然后交给启动vue项目的服务器去请求。

    配置多个服务端请求

    其实只要弄明白了上面处理跨域的过程,就很容易理解如何配置多个服务器请求,无非是再处理一遍,在.env.development文件中添加新的代理字段,VUE_APP_UPLOAD_API = '/dev-upload-api'

    对应的在vue.config.js中添加一个新的代理,

    我们复制request.js,改名request-proxy.js,内容一致,只修改baseURL:''

    (1)在上传图片文件时如下图的写法,请求路径会变成http://localhost:9528/dev-upload-api/upload/uploadImage,实际上的请求路径是http://localhost:8002/upload/uploadImage,就成功了。

    (2)在请求的需要使用的api文件中如下图引入使用

    这样请求路径会变成http://localhost:9528/dev-upload-api/+请求路径,实际的请求地址变成了http://localhost:8002/+请求路径。

    可能你的项目不是使用的vue-admin-template,但只要是vue+axios,配置的思路都是一样的,只要能理解了如何配置,相信你也可以解决自己的问题。

    展开全文
  • 3、执行过程组中,输出中没有变更请求的3过程:9.2组建团队9.3建设团队10.2管理沟通 输出变更请求的那些子过程 -> 变更请求 -> 实施整体变更控制 -> 批准的变更请求 -> 控制质量 -> 确认的变更 -&...
  • 如何使用Android Studio发送一个简单的GET/POST网络请求

    千次阅读 多人点赞 2021-01-09 17:06:42
    Android Studio发送简单的GET/POST网络请求阅读...本着点赞投币一键三连不迷路的原则,小编第句话就把开发环境给出,避免版本相差太而浪费您的时间。 感谢各位大佬们打开小弟的文章,本篇文章纯粹针对于那些对于And
  • 在Controller类上加上下面的注解即可,其它请求继续在数组中添加通过逗号分隔 @RequestMapping(method = {RequestMethod.GET,RequestMethod.POST}) 完整的代码如下 import org.springframework.web.bind.annotation...
  • 经过次测试,当服务器的类的成员变量(id)是 int 的时候,前段传入空字符串就会出现这问题, 我的就是这样引起的 要么前段判断下 id 是否为空字符串,设置为 -1 ,要么就不传这,类的默认值为0 ,注意下参数...
  • 一道经典的面试题是从 URL 在浏览器被被输入到页面...现代浏览器在与服务器建立了一个 TCP 连接后是否会在一个 HTTP 请求完成后断开?什么情况下会断开? 一个 TCP 连接可以对应几个 HTTP 请求一个 TCP 连接中 HT
  • 这时候我们可以通过过期的时候传递一个值存在localStorage中,然后进入登录界面在生命周期函数中,判断该值是否存在来判断是否是因为登录失效而返回的登录界面.如果是就提示用户登录失效,如果不是则不做任何操作. ....
  • 我们一般所了解到的爬虫都是爬取一个网站,但是当我们想要爬取多个网站的时候,就只能写两个爬虫程序来爬取,那么所需要的时间也会更多。那么,我们如何才能用爬取一个网站的时间来实现两个甚至多个网站的爬取呢?...
  • 背景技术:随着互联网发展的越来越快,技术也更新的非常频繁,比如开发一个系统的架构由最初始的单个服务器就能处理演变到现在的利用springcloud技术实现的微服务,随着业务的越来越复杂,结构也变得越来越复杂。...
  • 大家好,我是前端岚枫,枚二线城市的程序媛,今天主要跟大家分享我整理的笔记2021前端面试题系列:HTTP请求和HTTP缓存控制,此方面内容在我们的工作中常用到, 也是面试官经常提问的问题,希望下面文章对大家有所...
  • 查询所有的pid并杀死。...1. 符号:` `名称:反引号,上分隔符位置:反引号(`)这字符一般在键盘的左上角,数字1的左边,不要将其同单引号(’)混淆作用:反引号括起来的字符串被shell解释为命令行,在执...
  • 直接把表单里面的参数写进 Controller 相应方法的形参中去,(貌似这获取参数的方法适合get提交,而不适合post提交,未亲自验证,我觉得应该各种请求都可以) /** * 1.直接把表单的参数写在Controller相应的方法的...
  • 4.2.2异步请求高级模式

    千次阅读 2021-04-19 14:59:37
    我们可能希望从异步请求得到的结果就是这偏移盘,而不希望根据Cl1.entResponse对象再去获取。异步请求对象提供了“组合加适配器”(co111pose+Adapter)的模式,可以让调用者直接获取异步请求对象的结果。 异步请求...
  • 使用httpflow提取HTTP数据包的请求和响应
  • 请求到了Gateway后,可以被Gateway做了修改,再转发给真正的服务提供者,这些小把戏,有时候也能发挥重要的作用
  • Chrome可以通过控制台实现对某个请求的重放,即复制某个请求,然后自己实现对该请求次发送。这功能有什么用呢?在web开发中,调试代码或者调试找bug的时候就派上用场了。使用方法如下:在Chrome上按f12打开...
  • 您可以在Photoshop中打开文件,但该程序会显示条错误消息:“由于程序错误,Photoshop无法完成您的请求。”如果听起来很熟悉,请不要担心-您并不孤单。事实证明,近年来许多用户注意到了这问题。 该错误最令人...
  • 大家好,我是前端岚枫,今天主要跟大家分享我整理的笔记2021前端面试题系列:fetch与axios、浏览器内...fetch 是一个低层次的API,你可以把它考虑成原生的XHR,所以使用起来并不是那么舒服,需要进行封装。多年来,XML.
  • iOS网络请求错误整理

    千次阅读 2020-12-30 11:57:22
    在iOS开发中经常会遇到网络请求的错误, 方面可能会是自己网络请求的方式, 参数, 请求头等造成的; 另方面可能就是后台写的接口出了问题; 所以看懂报错原因就显得尤为重要.. iOS错误状态码经常遇到的错误是400~...
  • GET请求和POST请求详述

    千次阅读 2021-12-10 12:03:17
    GET请求和post请求一、GET请求1、什么是GET...我们知道,HTTP是超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议。举个简单的例子: 客户端(浏览器)向服务器 提交HTTP请求,服务器收集到请求后向客户
  • 主要讲述修复“由于i/o设备错误,无法运行此项请求”错误提示的方法,以及格式化移动硬盘的方法。
  • 【PostMan】postman如何发送并发请求

    千次阅读 2021-04-04 19:06:10
    1.概述 假设我们有一个接口,单次调用可以调通, ...然后我们将这个接口加入到集合,也可以复制一个接口或者多个到集合 然后点击 后面点击运行就可以模拟 20个线程,轮训集合中的接口,并发的调用。 ...
  • 请求超时什么意思

    千次阅读 2021-07-05 01:31:37
    大家好,我是时间财富网...通过次尝试仍无法建立有效连接时,则客户机就会返回一个请求超时的提示。客户机它是一种分布式计算机体系结构,充分利用中央处理机和服务器,采用智能终端,把数据和程序放在服务器上...
  • 这一看,不太妙,服务器直接来一个“您提交的数据无法被验证” 。好家伙,发现就是携带的cookiedi丢失了。请求接口Set-Cookie后头有一个黄色的感叹号,鼠标放上去有一个浮窗弹出,大致意思就是说,有一个一个域的...
  • uView JS网络请求

    千次阅读 2021-11-18 09:12:43
    false, // 是否在拦截器中返回服务端的原始数据 loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透 // 配置请求头信息 header: { 'content-type': 'application/json;charset=UTF-8' }...
  • 已经很明显能感觉到页面的响应速度变得特别慢,接着出现了第一条错误信息:服务器繁忙,请您稍后再试: 随着几次刷新之后,进到了第一个系统页面,这里原本应该可以获取到的考试信息显示无法获取: 随着几次刷新后,...
  • ABAP基础知识 传输请求(二 管理)

    千次阅读 2021-11-30 01:17:40
    点击蓝字关注我们一前言传输请求是ABAP开发的一个很重要的工具,主要负责把开发的对象或配置的内容从源系统(开发系统)传输到目标系统(测试/生产系统).按照传输请求的生命周期,把相应的功能...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,633,297
精华内容 653,318
关键字:

无法请求一个或者多个