许多小伙伴们一直搞不懂,flask到底是多线程的还是单线程的,今天,就为大家仔细梳理一下,给出一个有说服力的答案。首先明确一点,flask只是一个框架,到底多线程还是单线程,取决于你如何部署它。
flask内置了一个服务器,它不能用于生产环境,只能用于开发测试环境,这个服务器默认情况下是开启多线程的,下面这段代码可以演示这种情况
import threading
import time
from flask import Flask
app = Flask(__name__)
count = 0
@app.route('/')
def hello_world():
global count
count += 1
if count % 2 == 1:
print(threading.currentThread().ident, 'sleep 10')
time.sleep(10)
else:
print(threading.currentThread().ident, 'no sleep')
return 'Hello World!'
if __name__ == '__main__':
app.run()
hello_world函数在响应请求时会输出线程的唯一标识,如果是第奇数个请求,则sleep 10秒钟,使用curl 命令连续两次发出请求
curl http://127.0.0.1:5000/
这里千万不要用浏览器来做实验,两次请求都是相同的url,浏览器可能会进行优化导致两次请求使用相同的socket连接。如果flask内置的服务器使用的是多线程,那么第一个请求将延迟10秒钟返回,第二个请求则立马返回结果,不受第一次请求的影响,实验结果与前面的分析是一致的。
如果你希望flask用单线程来处理请求,那么需要设置threaded参数
if __name__ == '__main__':
app.run(threaded=False)
很多教程说threaded默认值是False, 但在flask 1.1.1 版本中,如果你不设置threaded 为False, 那么flask会设置为True,开启多线程模式。
uwsgi 是应用非常广泛的wsgi服务器,它可以指定进程的数量和线程的数量,借用其官方文档上的一个例子
uwsgi --http :9090 --wsgi-file foobar.py --master --processes 4 --threads 2
这个配置将启动4个进程,每个进程启动2个线程来提供服务,这意味着最多的时候可以同时服务8个请求。如果flask应用希望自己可以启动多线程,那么uwsgi需要配置 enable-threads 等于True,但如果你已经配置了--threads,且大于1,那么enable-threads默认开启。
QQ交流群: 211426309