flask 是多线程还是单线程

许多小伙伴们一直搞不懂,flask到底是多线程的还是单线程的,今天,就为大家仔细梳理一下,给出一个有说服力的答案。首先明确一点,flask只是一个框架,到底多线程还是单线程,取决于你如何部署它。

1. 内置的服务器

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,开启多线程模式。

2. 使用uwsgi

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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案