ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

fastapi-事件循环-线程池-阻塞

fastapi-事件循环-线程池-阻塞 概念含义在 Python 中的例子进程一个运行中的程序实例有自己的内存空间运行python main.py通常启动一个 Python 进程线程进程内部执行代码的单位同一进程的线程共享内存主线程、线程池里的工作线程协程可以暂停和恢复执行的任务由事件循环调度async def定义的函数所产生的协程线程池管理并复用多个工作线程接收任务并执行FastAPI 用它执行普通def路由协程不会自动创建线程。一个事件循环通常在一个线程里调度许多协程某个协程等待异步 I/O 时它可以切换去处理其他协程。Python 线程文档、协程文档FastAPI 根据函数类型选择调用方式FastAPI 调用的函数执行位置等待期间的情况async def路由或依赖事件循环所在的线程真正异步等待时可以处理其他任务普通def路由或依赖线程池里的工作线程工作线程可能阻塞事件循环仍可继续你直接调用的普通工具函数调用它的线程不会自动转交线程池调用测试main.py import asyncio import time from fastapi import FastAPI app FastAPI() app.get(/a) async def a(): await asyncio.sleep(3) return {route: a} app.get(/b) def b(): time.sleep(3) return {route: b} app.get(/c) async def c(): time.sleep(3) return {route: c}compare.py import time from concurrent.futures import ThreadPoolExecutor from urllib.request import urlopen def request(route): url fhttp://127.0.0.1:8000/{route} with urlopen(url, timeout30) as response: return response.read().decode() def compare(route): start time.perf_counter() with ThreadPoolExecutor(max_workers3) as pool: # 同时提交 3 个请求 futures [ pool.submit(request, route) for _ in range(3) ] # 等待所有请求完成 for future in futures: future.result() elapsed time.perf_counter() - start print(f/{route}3 个请求全部完成耗时 {elapsed:.2f} 秒) for route in [a, b, c]: compare(route)运行结果
返回列表