Flask 之多线程并发模式

多线程模式设置 threaded=True 即可,适合于 I/O 密集型应用,使得可以充分提升 CPU 的利用率。

单线程模式

python 复制代码
import time
from flask import Flask

app = Flask(__name__)


@app.route('/long-task', methods=['GET'])
def long_task():
    time.sleep(5)  # 模拟长时间操作
    return {"result": "Done"}


app.run(threaded=False, port=5000)

多线程模式

python 复制代码
import time
from flask import Flask

app = Flask(__name__)


@app.route('/long-task', methods=['GET'])
def long_task():
    time.sleep(5)  # 模拟长时间操作
    return {"result": "Done"}


app.run(threaded=True, port=5000)

并发请求对比

为了模拟并发请求,我们使用多线程同时发起多个请求,然后看程序执行完毕时整体请求花费的时间。

python 复制代码
import datetime
import threading
import requests


def run():
    url = r"http://127.0.0.1:5000/long-task"
    response = requests.request('get', url)
    print(response.json())


if __name__ == '__main__':
    start_time = datetime.datetime.now()
    print('start_time:', start_time)
    thread_list = []
    for i in range(5):
        t = threading.Thread(target=run)
        thread_list.append(t)

    for t in thread_list:
        t.daemon = True
        t.start()

    for t in thread_list:
        t.join()

    end_time = datetime.datetime.now()
    print('end_time:', end_time)
    print('一共用时:', end_time - start_time)

单线程模式下,即使同时发起多个请求,服务端仍然是一次只处理一个请求,其他请求需要等待。

python 复制代码
start_time: 2026-01-04 16:02:31.589845
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
end_time: 2026-01-04 16:02:56.646640
一共用时: 0:00:25.056795

多线程模式下,服务器会为每个新请求创建一个新线程**,**可以同时并发处理多个请求。

python 复制代码
start_time: 2026-01-04 16:09:33.286395
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
{'result': 'Done'}
end_time: 2026-01-04 16:09:38.303070
一共用时: 0:00:05.016675

当启动多线程模式时,如果发现日志文件中的日志打印顺序并不完全是串行的话,请勿要多虑。

相关推荐
谁在黄金彼岸7 分钟前
WinSW在Win7上失败真相-实测与修复
后端
苦瓜打怪兽14 分钟前
leetcode 热题100(11. 盛最多水的容器)
python·算法·leetcode
花间相见15 分钟前
【后端开发|Redis进阶01】—— Redis分布式锁全解:从SETNX到Redisson看门狗,再到RedLock
后端·面试
llqbzllll19 分钟前
A2A 1.0 到底和 MCP 差在哪:从 Agent Card、Task 到 Java 最小互操作
后端
花间相见20 分钟前
【后端开发|JVM基础01】—— Java垃圾回收全解:从分代内存模型到各收集器的分代职责
后端
geovindu24 分钟前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
pe7er26 分钟前
Spring Boot 日志最佳实践:接入、分级、异常记录与滚动拆分
后端
砚底藏山河26 分钟前
量化实战:回测数据底座快照与版本管理进阶
java·大数据·python·金融·maven
“AI国潮设计-小江”28 分钟前
《Python+SDXL实战:用ControlNet批量生成“英歌舞麻将糕”IP,附自动化脚本与商用思路》
开发语言·人工智能·python·prompt·aigc