-
2020-12-20 02:22:39
假设服务器跑着这样一段简单的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
更多相关内容 -
一个http请求就是一个线程吗?Java的服务是每收到一个请求就新开一个线程来处理吗?
2021-03-29 21:14:05java的服务是每收到一个请求就新开一个线程来处理吗?tomcat呢? 总结 http请求,就是来银行办理业务的用户。tomcat,就是银行。一个线程,就是开辟一个窗口。 线程是共享cpu的,那么多线程比单线程,能提升...- 声明:本文并非原创,但是原文排版和语言逻辑有明显的问题,因此就对原文进行一个梳理,并加以补充,来帮助理解。
- 原文链接:CSDN_一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
问题一:一个http请求就是一个线程吗?
答案:是,一个http请求,就是一个线程。
问题二:Java的服务是每收到一个请求就新开一个线程来处理吗?
答案:不一定,下面的图片解释为什么答案是不一定。图片摘自:tomcat连接数线程数、java的服务是每收到一个请求就新开一个线程来处理吗?tomcat呢?
关于“单线程”与“多线程”可以这样形象地比喻:
tomcat,是银行;一个线程,就是一个来银行办理业务的用户,每个线程带着一个http请求。线程是共享cpu的。
那么多线程和单线程相比,能提升处理速度吗?(备注:一个CPU可以包含一个或两个内核,一个内核又可以有一个或两个线程)
好比,一个窗口,三个人来办理业务。单线程:一个办完,下一个再开始办。多线程:大家轮流着办,一会给A办,一会儿给B办。
就一个窗口而言,单线程,多线程,耗时差别并不大,并没有明显提升效率。
那么为什么还说多线程比单线程效率高呢?
总结:
1. 一个http请求是一个线程吗?
可以这样来说:一个请求,就对应了一个线程。
2. Java的服务每收到一个请求就新开一个线程来处理吗?
受到tomcat启动的“最大线程数”和“接受排队请求个数”的制约。当已经开启的线程数目小于“最大线程数”时,自然是来一个请求,就会开启一个线程来处理这个请求。但是一旦超过了最大线程数,而又小于允许排队个数,就可以在那排着队,等待着前面的请求执行完了,空出来线程再分配给这些处于等待状态的请求。而如果处于等待的http请求已经等于了允许等待个数,便会直接拒绝此次请求。
-
java的服务是每收到一个请求就新开一个线程来处理吗 tomcat呢
2021-02-19 23:29:55收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。 2、那么,问题来啦: java的服务是属于那种形式呢,怎么区分? 比如tomcat又是属于哪种呢? 首先,服务器的实现不止有这...1、据说服务有两种:
- 收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞
- 收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。
2、那么,问题来啦:
- java的服务是属于那种形式呢,怎么区分?
- 比如tomcat又是属于哪种呢?
首先,服务器的实现不止有这两种方式。
3、服务器模型:
1、单线程模型:收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。一般的服务器不会使用这种方式实现。
2、非阻塞模型:收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞
首先纠正一个错误,这并不是非阻塞,它也是阻塞的。相对第一个模型来说,它解决了主线程阻塞的问题,有了一定程度的并发量,但是在每个新开的线程中还是阻塞的。如果100个人同时访问,将会开100个线程,那1000个人,10000个人呢?频繁开关线程很消耗资源,这样实现的服务器性能依然不高。除了上面的两种方式,接下来的说说其他更好的方式:
3、线程池:但是不是每次收到请求就开一个新的线程,而是使用线程池
如果不了解线程池,你可能会了解数据库连接池,由于频繁创建、关闭数据库连接会消耗资源,所以会用数据库连接池来保存一定数量的连接,如果需要就从连接池里取连接,不需要则放回连接池,不在频繁创建。线程池也是一样的道理,线程池管理多线程,性能比频繁创建线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。4、基于Java NIO实现的服务器模型
上面说到的几种模型,都是基于BIO(阻塞IO)。而NIO则是非阻塞IO,它是基于IO多路复用技术(例如Reactor模式)实现,只需要一个线程或者少量线程,就可以处理大量请求。从性能上来说NIO实现的服务器并发性一般大于BIO,所以可以实现高性能的服务器。如果感兴趣,可以学习一些基于NIO的网络编程框架,例如Netty、MINA。4、tomcat方式
Tomcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" .../>
从性能上考虑建议使用NIO。
5、问题:tomcat如何处理多用户同时请求?
http请求,到业务处理,再到响应的过程,是在一个线程里面的。
对tomcat来说,每一个进来的请求(request)都需要一个线程,直到该请求结束。tomcat内部维护了一个线程池,它允许有一定上线的线程同时运行。每一个http请求,会从线程池中取出一个空闲线程。默认初始化75个线程,可以进行修改。
6、问题:那么spring boot 环境下,tomcat的运行模式是哪种?
Spring Boot内置了tomcat容器,直接运行Application就可以启动web服务器。
7、在tomcat中提供了三种方式:BIO、NIO、APR。
BIOtomcat7以下的版本都是BIO,就是一个请求是一个独立的线程。不能适用高并发的场景。
NIO在8以上的版本,默认都是NIO,一个线程处理所有请求,通过回调方式。
APRAPR是一种基于JNI的文件和网络读写模式,现在很多高版本的tomcat,都默认走它了。
SpringBoot默认是以
java -Xmx256m -Xss256k -jar xx.jar
来运行内置Tomcat启动方式默认是NIO -
一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
2019-03-16 19:30:29一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗 答案是:是,一个http请求,就是一个线程。 https://blog.csdn.net/elvis_lfc/article/details/53466877 ... ===总结 ...一个http请求就是一个线程吗,java的服务是每收到一个请求就新开一个线程来处理吗
答案是:是,一个http请求,就是一个线程。
https://blog.csdn.net/elvis_lfc/article/details/53466877
https://blog.csdn.net/h12kjgj/article/details/55063956
===总结
1http请求,就是来银行办理业务的用户。
2tomcat,就是银行
3一个线程,就是开辟一个窗口
5线程是共享cpu的,那么多线程比单线程,能提升处理速度?
好比,一个窗口(一个cpu),三个人来办理业务。
单线程:一个办完一个办。
多线程:大家轮着办,我一会给你办,你会儿给他办。
但是单线程,多线程,耗时是一样的。并没有提升效率,那么为什么还说多线程比单线程效率高呢?
原文:https://blog.csdn.net/Ideality_hunter/article/details/82255439
版权声明:本文为博主原创文章,转载请附上博文链接! -
jmeter一个线程组下面有多个请求,怎么只让一个请求并发执行?
2020-07-09 16:11:55方法一:逻辑控制器---仅一次控制器 方法二:逻辑控制器--循环控制器,登陆设置为1,发帖设置为永远 -
【Jmeter】一个线程组下面有多个请求,怎么只让一个请求并发执行?
2017-07-07 11:01:191. 我一个线程组下面有多个请求,比如访问(拉取token)、登入(获取sesseion)、创建订单 2. 其中访问、登入我只要执行一次就行了,我只要拿去到他们的返回值就行了,就是创建订单我要并发多次,请问这个应该怎么弄? -
C#多线程处理实现post并发请求
2018-03-01 08:06:28需求是这样:如从文件中读取了10条数据,将数据参数循环给post请求,然后分别记录每个请求所用时间,最后记录平均请求时间,希望能从原有代码上使用多线程处理。请求和响应。 原有代码: //读取excel ds = ... -
java的服务是每收到一个请求就新开一个线程来处理吗?tomcat呢?
2018-09-29 22:27:44收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞。 那么,问题来啦: java的服务是属于那种形式呢,怎么区分? 比如tomcat又是属于哪种呢? 首先,服务器的实现不止有这两... -
springboot项目,controller多线程处理同一个request时,request.getParameter(),有时获取不到请求参数
2019-09-17 08:53:11每个线程run方法里面使用同一个request,然后通过request.getParameter()获取入参。多次查询总有那么1,2个线程拿不到参数,跑出空指针异常。我把代码排查到如下类似代码,可以复现问题。使用postman模拟请求... -
一个请求方法是一个线程吗?不是!
2017-03-02 10:27:35之前对于线程和方法的理解有些偏差,竟稀里糊涂的认为一个线程就是一个方法,一个方法就是一个线程。尤其在理解ThreadLocal执行原理的时候,更是晕乎 (ThreadLocal把当前线程作为key,来维护管理一个可变的对象,... -
多线程,到底该设置多少个线程?
2019-06-02 13:26:30作者:享学课堂老顾 微信公众号: 享学课堂online 一、前言 “不好了,线上服务器超时严重,请求非常...有个严重误区,以为线程池设置太小了,调大点请求就会快了。 今天就带着小伙伴们沟通一下,线程池的大小应该... -
jmeter实现多个请求并行执行,验证线程安全
2019-04-24 17:25:59最近有线上发现一个bug:多个业务场景并行请求,出现下发结果存在串的现象。 一、现象描述 如下图所示:两个不同策略出现串的情况 二、压测原理 新建测试计划时有个独立运行每个线程组选项 1、勾选独立运行每个线程... -
一个Servlet同一时刻只有一个... 当多个请求发送到同一个Servlet,服务器会为每个请求创建一个新线程来处理。
2017-06-17 13:22:14每个Servlet都对应一个URL地址,可以作为显式URL引用调用,或嵌入在HTML中并从Web应用程序返回 -
JAVA多线程10个线程处理1000个数据
2018-11-06 11:02:14import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; ...public class MultiT..... -
Android使用协程(Coroutine)优雅的处理多个接口同时请求(网络并发请求)
2019-09-19 14:34:42Android中同时请求多个网络接口 我们在开发过程中,很可能会遇到这样的需求,一个页面中需要同时请求好几个接口。 我在之前写过一篇关于 高德逆地理编码接口返回数据格式不统一以及百度逆地理编码接口返回数据解析... -
多线程处理任务并合并数据
2018-12-29 17:19:28newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待... -
iOS开发之线程组解决请求多个接口数据,完成后,再刷新界面
2018-07-18 16:34:38//线程组解决同一个界面需要请求多个接口数据,当全部请求完成后,再进入主线程刷新界面 /* 这种问题使用 dispatch_group_enter(grpupE);来解决,dispatch_group_enter 和 dispatch_group_leave 必须要成对... -
多线程应用(一)—Http请求阻塞回调处理
2017-11-13 16:48:28多线程应用(一)—Http请求阻塞回调处理1.需求描述1.1场景说明:由于,微信端的业务需求量越来越大.将业务与微信第三方事件处理耦合在一起的单一项目的结构已经逐渐暴露出,承载能力不足的缺点.所以,需要将与微信的交互... -
高并发模拟~多个线程同时发起请求
2019-07-09 23:30:10高并发模拟,多个线程同时发起请求 两种方案: CyclicBarrier:栅栏,所有的线程必须同时到达栅栏位置,才能继续执行。 CountDownLatch:计数器,一个线程或多个线程一直等待,直到其他线程执行的操作完成。 1、... -
springMVC 一个Controller处理所有用户请求的并发问题
2018-12-10 13:52:12SpringMVC一个Controller处理所有用户请求的并发问题 有状态和无状态的对象基本概念: 有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。 无状态对象... -
Python环境下OpenCV视频流的多线程处理方式
2020-11-24 19:52:44后面考虑到演示效果,从单线程改为了多线程,即单独用一个线程实时捕获视频帧,主线程在需要时从子线程拷贝最近的帧使用即可。通过这样的修改,不仅时延基本消失,整个流程的实时性也有相对的提升,可以说 -
关于NIO是如何处理多个请求的没搞明白
2016-09-05 12:34:233, 如果是多线程处理,是每个请求对应一个线程, 还是多个请求对应一个线程?如果是多个请求对应一个线程,那么与BIO中 线程池+队列 的方式有何区别? 4, NIO是非阻塞的, 但ServerSocketChannel的accept()方法和Selector... -
flask 源码浅析(flask 如何处理请求(多线程,多进程,IO多路复用))
2018-04-04 13:09:47unix 平台下 tornado 使用了kque , 由于flask 之前没有看过底层的实现,因此趁着清明假期看了一下flask,到底是来一个请求使用一个线程呢,还是进程呢,还是IO多路复用。 涉及到的源码文件 site-packages... -
2.2.4 Kafka请求处理线程
2021-04-15 00:16:592.2.4 Kafka请求处理线程 KafkaServer会创建请求处理线程池(KafkaRequestHandlerPool),在请求处理钱程池中会创建并启动多个请求...注意:一个KafkaServer有多个请求处理线程,但是只有一个KafkaApis。相关代码如下: -
多线程是同时执行多个线程的吗
2020-03-26 18:25:50解释1:当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程... -
vue 多个请求并发的处理方式Promise
2018-12-20 15:23:35let getProd = new Promise((resolve, reject) => { apiProduct({prdctId}, res => { ...是将两个或多个请求放在一起,等待两个请求或多个请求都有返回时,才执行成功的回调,如果有一个返回失败,则会报错 -
一个接口同时接收到多个用户的请求,是怎么执行的?
2020-01-20 11:19:39tomcat会维护一个线程池,多个请求就会分配多个线程处理,一个请求一个线程 可通过修改tomcat的配置改变默认线程的数量 不是线程越多性能越好 同一时间并发执行的线程数量是有限的,不能无限扩展tomcat中的线程,...