在Python的Flask框架中,app.run()方法的源码主要是通过werkzeug.serving模块提供的服务器运行器来实现的,可以在Flask应用程序初始化时指定服务器运行器,默认情况下使用Werkzeug中的WSGI服务Werkzeug的WSGI服务器主要是基于SocketServer和ThreadingMixIn实现的线程池模型。当应用程序启动并开始监听指定端口时,该服务器会创建一个新的线程,并生成一个新的socket实例以等待客户端连接。
一旦有客户端连接上来后,就会为其创建一个新的线程去处理该请求,并根据HTTP协议规范进行解析和响应处理。在多个客户端同时请求时,Werkzeug的线程池模型能够支持同时处理多个请求,并控制线程池个数。当有新的请求到来时,如果当前所有线程都处于繁忙状态,则新请求会进入队列中等待处理;如果空闲线程数不足,则会创建新的线程去处理该请求,直到达到最大线程数限制。
以下是Flask中app.run()方法中与并发请求相关部分的代码:
# flask/app.py
def run(self, host=None, port=None, debug=None, load_dotenv=True, **options):
# ...
from .serving import run_simple
try:
run_simple(host, port, self, **options)
finally:
# ...
# flask/serving.py
def run_simple(hostname, port, application, **options):
# ...
server = make_server(hostname, port, application, threaded=True, **options)
try:
server.serve_forever()
except KeyboardInterrupt:
pass
# werkzeug/serving.py
class ThreadedMixIn(object):
# ...
class ForkingMixIn(object):
# ...
def make_server(host=None,
port=None,
app=None,
threaded=False,# True 表示启用线程池模式
processes=1,
request_handler=None,
passthrough_errors=False,
ssl_context=None,
**options):
# ...
if threaded:
return ThreadedWSGIServer(
threadpool_workers=processes, # 线程池大小
passthrough_errors=passthrough_errors,
**server_options)
elif processes > 1: # 表示启用多进程模式
return ForkingWSGIServer(
processes=processes, # 进程数
passthrough_errors=passthrough_errors,
**server_options)
else:
return WSGIServer(
passthrough_errors=passthrough_errors,
**server_options)
通过上述代码可以看出,Flask中的app.run()方法主要是根据传入的host和port参数初始化一个Werkzeug的WSGI服务器,并通过指定的线程数或进程数来实现并发请求处理。其中,`threaded = True` 表示启用线程池模式,`processes > 1`表示启用多进程模式,而默认情况则是单线程单进程模式。同时,还可以根据业务需求调整线程池大小和进程数等参数来优化并发处理性能。