├── README.md └── main.py /README.md: -------------------------------------------------------------------------------- 1 | # asyncio-threadpool-demo -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from concurrent.futures import ThreadPoolExecutor 2 | from fastapi import FastAPI,Request,Response 3 | import uvicorn 4 | import asyncio 5 | import time 6 | 7 | # 创建web 8 | app=FastAPI() 9 | 10 | # 创建线程池 11 | threadpool=ThreadPoolExecutor(max_workers=200) 12 | 13 | # 第一个版本 14 | @app.get('/ver1') 15 | async def ver1(request: Request): 16 | # 获取参数 17 | msg=request.query_params.get('msg') 18 | 19 | # 获取async io event loop 20 | loop=asyncio.get_event_loop() 21 | 22 | # 准备计算任务 23 | task={ 24 | 'msg': msg, 25 | 'event': asyncio.Event(), 26 | 'result': None, 27 | } 28 | 29 | # 计算函数 30 | def handle_task(): 31 | print('task received:',task['msg']) 32 | task['result']=task['msg'].lower() 33 | time.sleep(2) # 模拟线程阻塞 34 | def async_callback(): 35 | print('task ends notified:',task['result'],asyncio.get_event_loop()) 36 | task['event'].set() 37 | loop.call_soon_threadsafe(async_callback) 38 | 39 | # 提交并等待结果 40 | threadpool.submit(handle_task) 41 | await task['event'].wait() 42 | 43 | return Response(task['result']) 44 | 45 | # 第二个版本 46 | @app.get('/ver2') 47 | async def ver2(request: Request): 48 | # 获取参数 49 | msg=request.query_params.get('msg') 50 | 51 | # 获取async io event loop 52 | loop=asyncio.get_event_loop() 53 | 54 | # 准备计算任务 55 | task={ 56 | 'msg': msg, 57 | } 58 | 59 | # 计算函数 60 | def handle_task(): 61 | print('task received:',task['msg']) 62 | result=task['msg'].lower() 63 | time.sleep(2) # 模拟线程阻塞 64 | return result 65 | 66 | # 提交并等待结果 67 | result=await loop.run_in_executor(threadpool,handle_task) 68 | return Response(result) 69 | 70 | 71 | if __name__=='__main__': 72 | uvicorn.run(app,host='localhost',port=8000) 73 | --------------------------------------------------------------------------------