一、区分理解:框架 vs 模块
- 模块(Python 内置 / 轻量工具,无完整服务能力) :
threading、ThreadPoolExecutor、asyncio - 框架(完整解决方案,可直接构建服务) :
Tornado、FastAPI
二、区分核心:模块 vs 框架
核心区别:模块是 "工具",提供单一 / 基础功能,需结合其他代码才能实现完整服务;框架是 "骨架",自带完整架构(如 Web 路由、请求处理),可直接基于框架快速搭建可运行的服务。
简单理解:模块是 "零件"(如螺丝、扳手),框架是 "成品机床"(可直接生产,零件仅作为其组成部分)。
三、逐个解析(功能 + 作用,贴合 vLLM 高并发场景)
1. threading(模块)
- 功能:Python 内置多线程基础模块,提供手动创建、管理线程的能力,基于操作系统线程实现并发。
- 作用:解决简单 IO 密集型任务的并发需求(如少量 vLLM API 调用、多文件读写),手动控制线程生命周期,实现基础并行执行。
- 特点:轻量、上手快,但需手动管理线程(如启动、等待、锁机制),不适合高并发(万级 +)。
2. ThreadPoolExecutor(模块)
- 功能:Python 内置线程池模块(
concurrent.futures子模块),对threading进行封装,自动创建、复用线程,无需手动管理线程生命周期。 - 作用:解决批量 IO 密集型任务的高并发需求(如批量调用 vLLM API),避免手动创建大量线程导致的资源浪费,提升并发效率。
- 特点:比
threading更易用、高效,支持任务超时控制,是日常开发中最常用的多线程工具。
3. asyncio(模块)
- 功能:Python 内置异步核心模块,提供协程、事件循环机制,基于单线程实现高并发,无操作系统线程调度开销。
- 作用:解决高 IO 密集型任务的高并发需求(如万级 + 高频 vLLM API 请求),是
Tornado、FastAPI的底层依赖,需配合异步库(如 aiohttp)使用。 - 特点:协程开销远低于线程,支持万级 + 并发,但事件循环是单线程,需配合线程池处理 CPU 密集型任务(如 vLLM prompt 预处理)。
4. Tornado(框架)
- 功能:基于
asyncio的异步 Web 框架,内置异步 HTTP 服务器,支持协程 + 多线程混合模式,自带路由、请求处理、异常捕获等完整 Web 服务能力。 - 作用:搭建高并发 Web/API 服务(如 vLLM API 部署),支持长连接、WebSocket,可直接集成 vLLM 引擎和线程池,兼顾高并发与服务规范性。
- 特点:底层依赖
asyncio,可直接复用异步生态,适合实时性要求高的高并发服务。
5. FastAPI(框架)
- 功能:基于
asyncio和 Starlette 的异步 Web 框架,原生支持协程,集成 Pydantic 参数校验,自动生成 Swagger 接口文档,自带完整 Web 服务架构。 - 作用:搭建高并发、易调试的 API 服务(如 vLLM API 优化),与 Pydantic、vLLM 适配性极强,开发效率和并发性能优于 Tornado(轻量场景)。
- 特点:易用性高、自动生成接口文档,适合需要快速开发、规范校验的高并发 API 场景。
四、总结(贴合 vLLM 场景)
- 做简单 / 批量 IO 并发(少量 vLLM 请求):用
threading(简单场景)、ThreadPoolExecutor(批量场景); - 做万级 + 高并发(高频 vLLM 请求):用
asyncio(底层协程),搭配Tornado/FastAPI(Web 服务框架); - 搭建可直接部署的 vLLM API 服务:优先选
FastAPI(易用、适配性强)或Tornado+asyncio(高并发 + 实时性)。
五、这5个工具的高并发实现
聚焦5个核心模块/框架(threading、ThreadPoolExecutor、asyncio、Tornado、FastAPI),重点讲解如何基于它们实现多线程异步高并发服务,结合日常开发及正在使用的 vLLM API 场景,提供可直接运行的代码示例、核心配置及注意事项,清晰区分各框架的实现逻辑与适用场景。
1、核心前提说明
这5个工具的高并发实现,核心分为两类逻辑,需先明确区分:
-
「多线程并发」:threading、ThreadPoolExecutor(基于操作系统线程,受GIL限制,适合IO密集型);
-
「异步并发」:asyncio(底层核心)、Tornado、FastAPI(基于协程+事件循环,无GIL困扰,适合高IO密集型,可结合多线程处理CPU密集型任务)。
所有示例均贴合「高并发服务」场景(如API接口、批量任务处理),适配现有技术栈(可直接对接vLLM推理、Pydantic校验)。
2、逐个框架实现多线程异步高并发(附代码+实操)
1. threading(基础多线程,手动管理线程)
核心:手动创建线程,通过线程锁控制资源竞争,适合简单IO密集型服务(如多接口请求、文件读写),可实现基础并发。
实现高并发服务示例(多接口并发调用)
python
import threading
import requests
import time
# 定义并发任务(IO密集型:调用vLLM API示例)
def call_vllm_api(prompt):
"""模拟调用vLLM API,IO密集型任务"""
url = "http://localhost:9565/v1/completions" # 你的vLLM API地址
data = {
"prompt": prompt,
"max_tokens": 128,
"temperature": 0.7
}
try:
response = requests.post(url, json=data)
return response.json()
except Exception as e:
return {"error": str(e)}
# 高并发实现:手动创建多线程
if __name__ == "__main__":
# 1. 定义任务列表(模拟10个并发请求)
prompts = [f"解释什么是数字分身_{i}" for i in range(10)]
threads = []
lock = threading.Lock() # 线程锁,避免资源竞争(可选,视场景而定)
start_time = time.time()
# 2. 创建线程,批量执行任务
for prompt in prompts:
# 每个任务启动一个线程
t = threading.Thread(target=call_vllm_api, args=(prompt,))
threads.append(t)
t.start() # 启动线程
# 3. 等待所有线程执行完毕
for t in threads:
t.join()
end_time = time.time()
print(f"10个并发请求执行完成,耗时:{end_time - start_time:.2f}s")
关键注意事项
-
避免大量线程创建(建议不超过50个),否则会导致线程上下文切换频繁,反而降低效率;
-
涉及共享资源(如全局变量、文件写入)时,必须用线程锁(Lock/RLock),防止数据错乱;
-
适合轻量并发(10~50个任务),不适合高并发(万级+),高并发建议用ThreadPoolExecutor。
2. ThreadPoolExecutor(线程池,自动管理线程)
核心:对threading的封装,自动创建线程池、复用线程,无需手动管理线程生命周期,适合批量IO密集型高并发服务,是日常开发中最常用的多线程工具。
实现高并发服务示例(批量处理vLLM推理请求)
python
from concurrent.futures import ThreadPoolExecutor
import requests
import time
# 定义IO密集型任务(调用vLLM API)
def call_vllm_api(prompt):
url = "http://localhost:9565/v1/completions"
data = {
"prompt": prompt,
"max_tokens": 128,
"temperature": 0.7
}
try:
response = requests.post(url, json=data)
return prompt, response.json()
except Exception as e:
return prompt, {"error": str(e)}
# 高并发实现:线程池批量处理
if __name__ == "__main__":
prompts = [f"解释什么是vLLM_{i}" for i in range(20)] # 20个并发请求
start_time = time.time()
# 1. 创建线程池(核心:设置合理的线程数,IO密集型建议设为 2*CPU核心数 + 1)
# 若你的服务器是112核,建议设为 225;4核建议设为9
with ThreadPoolExecutor(max_workers=9) as executor:
# 2. 批量提交任务,获取结果(两种方式:map/submit)
# 方式1:map(适合简单任务,返回结果顺序与任务顺序一致)
results = executor.map(call_vllm_api, prompts)
# 方式2:submit(适合需要获取任务状态、超时控制的场景)
# processList = [executor.submit(call_vllm_api, prompt) for prompt in prompts]
# results = [future.result() for future in processList]
# 方法3: submit简单写法
# 问题改写
process_rewrite = executor.submit(self.query_rewirte)
# 问题分类
process_intention = executor.submit(self.query_intention_filter)
# 并行计算
process_rewrite.result()
process_intention.result()
# 3. 处理结果方法1
for prompt, result in results:
print(f"请求:{prompt},结果:{result.get('choices', [{}])[0].get('text', '无结果')}")
# 3. 处理结果方法2
docs = []
for process in concurrent.futures.as_completed(processList):
tool_docs = process.result()
docs += tool_docs
end_time = time.time()
print(f"20个并发请求执行完成,耗时:{end_time - start_time:.2f}s")
关键注意事项
-
线程池大小(max_workers):IO密集型任务建议设为
2*CPU核心数 + 1,CPU密集型建议设为CPU核心数 + 1,避免线程过多导致资源浪费; -
submit() 可实现超时控制(future.result(timeout=5)),避免单个任务阻塞整个线程池;
-
适合批量IO密集型高并发(50~1000个任务),如批量调用vLLM API、多文件下载等。
3. asyncio(异步核心,协程并发)
核心:基于协程+事件循环,无操作系统线程调度开销,适合高IO密集型高并发(万级+),是Tornado、FastAPI的底层依赖,需配合异步库(如aiohttp)使用。
实现高并发服务示例(异步调用vLLM API,万级并发)
python
import asyncio
import aiohttp
import time
# 定义异步任务(IO密集型:异步调用vLLM API)
async def call_vllm_api_async(session, prompt):
url = "http://localhost:9565/v1/completions"
data = {
"prompt": prompt,
"max_tokens": 128,
"temperature": 0.7
}
try:
async with session.post(url, json=data) as response:
return prompt, await response.json()
except Exception as e:
return prompt, {"error": str(e)}
# 高并发实现:事件循环+协程批量执行
async def main():
prompts = [f"解释什么是异步并发_{i}" for i in range(100)] # 100个并发请求
start_time = time.time()
# 1. 创建异步HTTP客户端(复用连接池,提升效率)
async with aiohttp.ClientSession() as session:
# 2. 批量创建协程任务
tasks = [call_vllm_api_async(session, prompt) for prompt in prompts]
# 3. 并发执行所有协程任务(wait方法可控制并发量)
results = await asyncio.gather(*tasks)
# 4. 处理结果
for prompt, result in results:
print(f"请求:{prompt},结果:{result.get('choices', [{}])[0].get('text', '无结果')}")
end_time = time.time()
print(f"100个并发请求执行完成,耗时:{end_time - start_time:.2f}s")
if __name__ == "__main__":
# 启动事件循环(Python3.7+ 可简化为 asyncio.run(main()))
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
关键注意事项
-
必须使用异步库(如aiohttp、asyncpg),不能使用同步库(如requests),否则会阻塞事件循环;
-
事件循环是单线程的,若有CPU密集型任务(如模型预处理),需用
loop.run_in_executor()结合线程池,避免阻塞; -
适合高并发(万级+),如高频API请求、WebSocket服务,协程开销远低于线程。
4. Tornado 与 asyncio 配合使用(高并发服务最优实践)
核心:Tornado 底层依赖 asyncio 事件循环,二者天然兼容,配合使用可充分发挥 asyncio 的高并发协程优势,同时利用 Tornado 内置HTTP服务器、长连接等特性,适配vLLM API等高IO密集型服务,实现"协程高并发+Web服务规范化"。
核心逻辑:Tornado 接管Web请求入口,asyncio 负责协程任务调度,结合线程池处理CPU密集型任务,形成"Tornado(Web服务)+ asyncio(协程并发)+ 线程池(CPU密集)"的混合高并发架构,完美适配你的vLLM部署场景。
实现高并发服务示例(Tornado+asyncio+vLLM,可直接运行)
python
import tornado.web
import tornado.ioloop
from tornado.concurrent import ThreadPoolExecutor
from pydantic import BaseModel, Field
import json
import asyncio
from vllm import AsyncLLMEngine, AsyncEngineArgs
# 1. Pydantic参数校验(适配vLLM请求,与原有示例一致)
class VllmRequest(BaseModel):
prompt: str = Field(..., description="推理提示词")
max_tokens: int = Field(default=128, ge=32, le=1024)
temperature: float = Field(default=0.7, ge=0.0, le=1.0)
# 2. 定义asyncio异步任务(核心:抽离协程逻辑,供Tornado调用)
async def async_vllm_inference(vllm_engine, prompt, max_tokens, temperature):
"""asyncio协程任务:调用vLLM异步推理,纯IO密集型""" try:
# 调用vLLM异步引擎,与asyncio无缝兼容
result = await vllm_engine.generate(
prompt=prompt,
max_tokens=max_tokens,
temperature=temperature
)
return {
"generated_text": result.outputs[0].text,
"used_tokens": result.usage.total_tokens
}
except Exception as e:
raise Exception(f"vLLM推理失败:{str(e)}")
# 3. Tornado接口处理器(集成asyncio协程,配合线程池)
class VllmInferenceHandler(tornado.web.RequestHandler):
# 初始化线程池(处理CPU密集型任务,不阻塞asyncio事件循环)
executor = ThreadPoolExecutor(max_workers=28) # 112核A10服务器最优配置
def initialize(self, vllm_engine, async_loop):
self.vllm_engine = vllm_engine # 注入vLLM异步引擎
self.async_loop = async_loop # 注入asyncio事件循环(与Tornado共享)
# 异步处理Web请求(Tornado异步方法,内部调用asyncio协程)
async def post(self):
try:
# 1. 解析请求体,Pydantic校验(同步操作,不阻塞)
request_body = json.loads(self.request.body)
req = VllmRequest(**request_body)
# 2. (可选)CPU密集型任务:用线程池执行,避免阻塞asyncio事件循环
processed_prompt = await self.executor.submit(
self.process_prompt, req.prompt
)
# 3. 核心:调用asyncio协程执行vLLM推理(Tornado无缝对接asyncio)
inference_result = await async_vllm_inference(
self.vllm_engine,
processed_prompt,
req.max_tokens,
req.temperature
)
# 4. 格式化响应,返回给前端
self.write({
"code": 200,
"msg": "success",
"data": inference_result
})
self.set_header("Content-Type", "application/json; charset=utf-8")
except Exception as e:
self.write({
"code": 500,
"msg": "推理失败",
"error": str(e)
})
self.set_status(500)
# CPU密集型任务(单独用线程池执行,不占用asyncio事件循环)
def process_prompt(self, prompt):
"""模拟prompt预处理(CPU密集型,如文本清洗、格式转换)"""
return f"用户提问:{prompt},请用简洁、专业的语言回答,控制在100字内"
# 4. 初始化asyncio事件循环+Tornado服务(核心:共享事件循环)
def start_tornado_asyncio_service():
# 1. 初始化asyncio事件循环(Tornado将共享此循环,避免多循环冲突)
async_loop = asyncio.get_event_loop()
# 2. 初始化vLLM异步引擎(适配Qwen3-8B、A10 4GPU配置)
engine_args = AsyncEngineArgs(
model="/newdir/dev/vl/gao/text_qwen/models/qwen_8b_bad1_s08c1r1_good_c0r1",
tensor_parallel_size=4,
gpu_memory_utilization=0.92,
trust_remote_code=True
)
vllm_engine = AsyncLLMEngine.from_engine_args(engine_args)
# 3. 启动Tornado服务,注入vLLM引擎和asyncio事件循环
app = tornado.web.Application([
(
r"/vllm/inference",
VllmInferenceHandler,
{"vllm_engine": vllm_engine, "async_loop": async_loop}
)
])
# 4. 绑定端口(与vLLM服务端口一致,避免冲突)
app.listen(9565)
print("Tornado+asyncio高并发API服务启动,端口:9565")
# 5. 启动asyncio事件循环(Tornado请求将在该循环中调度)
async_loop.run_forever()
if __name__ == "__main__":
# 启动服务,实现Tornado+asyncio协同高并发
start_tornado_asyncio_service()
关键注意事项
-
共享事件循环:Tornado 与 asyncio 必须使用同一个事件循环(如示例中注入的 async_loop),避免多循环导致的协程调度混乱、资源浪费;
-
任务拆分原则:IO密集型任务(vLLM推理、HTTP请求)用 asyncio 协程执行,CPU密集型任务(文本预处理、数据计算)用线程池执行,彻底避免阻塞事件循环;
-
优势体现:比单独使用Tornado更灵活(可复用asyncio生态的异步库,如aiohttp),比单独使用asyncio更规范(有Tornado Web服务的路由、请求处理、异常捕获机制);
-
适配场景:完美对接你的vLLM API部署,支持万级高并发,同时兼顾Web服务的规范性和可维护性,是你当前技术栈的最优配合方式。
5. Tornado(异步Web框架,高并发API服务)
核心:基于asyncio,内置异步HTTP服务器,支持协程+多线程混合模式,适合高并发Web/API服务(如你部署的vLLM API),可直接集成多线程处理CPU密集型任务。
实现高并发API服务示例(集成vLLM,支持异步+多线程)
python
import tornado.web
import tornado.ioloop
from tornado.concurrent import ThreadPoolExecutor
from pydantic import BaseModel, Field
import json
from vllm import AsyncLLMEngine, AsyncEngineArgs
# 1. Pydantic参数校验(适配vLLM请求)
class VllmRequest(BaseModel):
prompt: str = Field(..., description="推理提示词")
max_tokens: int = Field(default=128, ge=32, le=1024)
temperature: float = Field(default=0.7, ge=0.0, le=1.0)
# 2. 定义Tornado接口处理器(异步+多线程)
class VllmInferenceHandler(tornado.web.RequestHandler):
# 初始化线程池(处理CPU密集型任务,如模型预处理)
executor = ThreadPoolExecutor(max_workers=4) # 4核设4,112核设28
def initialize(self, vllm_engine):
self.vllm_engine = vllm_engine # 注入vLLM异步引擎
# 异步处理请求(核心:避免IO阻塞)
async def post(self):
try:
# 解析请求体,Pydantic校验
request_body = json.loads(self.request.body)
req = VllmRequest(**request_body)
# 若有CPU密集型任务(如prompt预处理),用线程池执行,避免阻塞事件循环
processed_prompt = await self.executor.submit(self.process_prompt, req.prompt)
# 异步调用vLLM推理(IO密集型,不阻塞事件循环)
result = await self.vllm_engine.generate(
prompt=processed_prompt,
max_tokens=req.max_tokens,
temperature=req.temperature
)
# 格式化响应
self.write({
"code": 200,
"msg": "success",
"data": {
"generated_text": result.outputs[0].text,
"used_tokens": result.usage.total_tokens
}
})
self.set_header("Content-Type", "application/json; charset=utf-8")
except Exception as e:
self.write({"code": 500, "msg": "failed", "error": str(e)})
self.set_status(500)
# CPU密集型任务(单独用线程池执行)
def process_prompt(self, prompt):
"""模拟prompt预处理(CPU密集型)"""
return f"用户提问:{prompt},请用简洁语言回答"
# 3. 初始化vLLM引擎+启动Tornado服务
def start_tornado_service():
# 初始化vLLM异步引擎(适配Qwen3-8B)
engine_args = AsyncEngineArgs(
model="/newdir/dev/vl/gao/text_qwen/models/qwen_8b_bad1_s08c1r1_good_c0r1",
tensor_parallel_size=4, # A10 4GPU配置
gpu_memory_utilization=0.92
)
vllm_engine = AsyncLLMEngine.from_engine_args(engine_args)
# 启动Tornado服务(高并发配置)
app = tornado.web.Application([
(r"/vllm/inference", VllmInferenceHandler, {"vllm_engine": vllm_engine})
])
# 绑定端口(你的vLLM服务端口)
app.listen(9565)
print("Tornado高并发API服务启动,端口:9565")
tornado.ioloop.IOLoop.current().start()
if __name__ == "__main__":
start_tornado_service()
关键注意事项
-
Tornado默认是单进程单线程事件循环,高并发场景下可通过
tornado.process.fork_processes()开启多进程,配合多GPU使用; -
CPU密集型任务必须用 ThreadPoolExecutor 放在事件循环外执行,否则会阻塞整个服务;
-
适合高并发API服务(万级QPS),内置长连接、WebSocket支持,完美适配vLLM推理接口。
6. FastAPI(异步Web框架,高并发API+Pydantic适配)
核心:基于asyncio和Starlette,原生支持协程,集成Pydantic校验,自动生成接口文档,并发性能优于Tornado(轻量场景),适合高并发API服务,与你的vLLM、Pydantic技术栈高度适配。
实现高并发API服务示例(集成vLLM,支持异步+多线程)
python
from fastapi import FastAPI, BackgroundTasks
from concurrent.futures import ThreadPoolExecutor
from pydantic import BaseModel, Field
from vllm import AsyncLLMEngine, AsyncEngineArgs
# 1. 初始化FastAPI应用
app = FastAPI(title="vLLM高并发API服务", version="1.0")
# 2. Pydantic参数校验(与Tornado示例一致,无缝适配)
class VllmRequest(BaseModel):
prompt: str = Field(..., description="推理提示词")
max_tokens: int = Field(default=128, ge=32, le=1024)
temperature: float = Field(default=0.7, ge=0.0, le=1.0)
# 3. 初始化vLLM异步引擎和线程池
engine_args = AsyncEngineArgs(
model="/newdir/dev/vl/gao/text_qwen/models/qwen_8b_bad1_s08c1r1_good_c0r1",
tensor_parallel_size=4,
gpu_memory_utilization=0.92
)
vllm_engine = AsyncLLMEngine.from_engine_args(engine_args)
# 线程池(处理CPU密集型任务)
thread_pool = ThreadPoolExecutor(max_workers=28) # 112核A10服务器最优配置
# 4. CPU密集型任务(线程池执行)
def process_prompt(prompt: str) -> str:
"""prompt预处理(CPU密集型)"""
return f"用户提问:{prompt},请用简洁语言回答"
# 5. 高并发API接口(异步+多线程)
@app.post("/vllm/inference", summary="vLLM推理接口")
async def vllm_inference(req: VllmRequest):
# 异步调用线程池执行CPU密集型任务
processed_prompt = await app.state.loop.run_in_executor(
thread_pool, process_prompt, req.prompt
)
# 异步调用vLLM推理(IO密集型)
result = await vllm_engine.generate(
prompt=processed_prompt,
max_tokens=req.max_tokens,
temperature=req.temperature
)
# 返回响应
return {
"code": 200,
"msg": "success",
"data": {
"generated_text": result.outputs[0].text,
"used_tokens": result.usage.total_tokens
}
}
# 6. 启动服务(需用uvicorn异步服务器)
if __name__ == "__main__":
import uvicorn
# 高并发配置:workers设为CPU核心数,loop设为uvloop(提升性能)
uvicorn.run(
"main:app", # 替换为当前文件名(如当前文件是main.py,则为main:app)
host="0.0.0.0",
port=9565,
workers=4, # 4核设4,112核设16(避免过多进程抢占资源)
loop="uvloop"
)
关键注意事项
-
FastAPI需配合uvicorn(异步服务器)启动,workers数量建议设为
CPU核心数/4 ~ CPU核心数/2(A10 112核建议设16~28); -
原生集成Pydantic,参数校验更简洁,自动生成Swagger接口文档(访问 http://localhost:9565/docs 即可调试);
-
并发性能优于Tornado,适合高并发API服务(万级+QPS),与vLLM、Pydantic适配更顺畅,是你当前vLLM API优化的优选。
三、5个框架/模块的高并发实现对比(重点总结)
|--------------------|--------------|-----------------------|------------------------|----------------------------------|
| 框架/模块 | 并发类型 | 核心优势 | 适用场景(你的技术栈) | 关键配置要点 |
| threading | 多线程 | 内置、上手快,手动控制线程 | 简单IO密集型、轻量并发(少量vLLM请求) | 控制线程数量,用锁保护共享资源 |
| ThreadPoolExecutor | 多线程(线程池) | 自动线程复用,无需手动管理 | 批量IO密集型(批量调用vLLM API) | max_workers设为2*CPU核心数+1 |
| asyncio | 异步(协程) | 开销极低,支持万级+并发 | 高IO密集型、高频vLLM请求 | 配合aiohttp,CPU密集型用线程池 |
| Tornado+asyncio | 异步(协程)+Web服务 | 兼顾协程高并发与Web规范性,适配vLLM | vLLM API高并发部署、实时服务 | 共享事件循环,CPU密集型用线程池 |
| Tornado | 异步+多线程混合 | 内置服务器,支持长连接/WebSocket | vLLM API服务、实时推送 | 多进程部署,CPU密集型用ThreadPoolExecutor |
| FastAPI | 异步+多线程混合 | 集成Pydantic,自动接口文档,性能优 | vLLM API优化、高并发接口开发 | uvicorn启动,workers设为CPU核心数/4~1/2 |
四、实操建议(贴合你的场景)
-
若你当前用Tornado部署vLLM API,无需替换,可优化线程池配置(按CPU核心数设置max_workers),提升并发性能;
-
若想优化接口体验、简化参数校验,建议替换为FastAPI,与Pydantic、vLLM适配更顺畅,开发效率更高;
-
若追求高并发与Web服务规范性的平衡,优先采用
Tornado+asyncio配合方式,充分发挥二者优势,完美适配vLLM API部署; -
批量处理vLLM推理请求(如批量生成文本),用ThreadPoolExecutor(少量任务)或asyncio(大量任务);
-
所有高并发服务,需避免CPU密集型任务阻塞事件循环/线程池,务必单独用线程池执行。