做为异步 IO 框架,asyncio可以在单线程模式下处理更多的并发任务。 借助asyncio 模块,我们实现了以“同步”的方式编写“异步”的代码,有关事件循环、回调的部分,asyncio 模块在编程语言方面已经替我们完成了! asyncio 的核心即事件循环EventLoop,通过事件循环实现协程任务的注册、取消、执行以及回调等方法,并且提供了和...
fastapi 运行起来就已经有一个event loop,一个线程只能有一个loop,所以就不能再创建,直接使用已有的l...
loop.run_until_complete(asyncio.wait(tasks)) # 执行任务 loop.close() # 关闭事件循环列表 从代码中可以看出,使用async代替@asyncio.coroutine,使用await代替yield from,使得协程代码更加简洁易懂。async关键字将一个函数声明为协程函数,函数执行时返回一个协程对象。 await关键字将暂停协程函数的执行,等待异步IO返...
本地起一个简单的fastapi服务,定义4个接口,代码如下: fromfastapiimportFastAPIimporttimeimportasynciorouter=FastAPI()@router.get("/a")asyncdefa():time.sleep(1)return{"message":"异步模式,但是同步执行sleep函数,执行过程是串行的"}@router.get("/b")asyncdefb():loop=asyncio.get_event_loop()awaitloop...
35 loop = asyncio.get_event_loop() 36 tasks = [asyncio.ensure_future(ask_url(x)) for x in urls] 37 loop.run_until_complete(asyncio.wait(tasks)) 38 loop.close() 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ...
然后将耗时函数work放到一个event loop中去运行 如图 @api.get("/test2")asyncdeftest2():a=int(time.time())print(f"test2--start:{a}")loop=asyncio.get_event_loop()awaitloop.run_in_executor(None,work,8)b=int(time.time())print(f"test2--end:{b}")returnf"test2耗时:{b-a}" ...
port:数字,应用的端口,默认为8000, uds:字符串,socket服务绑定到UNIX的域名 fd:数字,从此文件描述符绑定到socket loop:[auto|asyncio|uvloop],事件循环模式,默认为auto http:[auto|h11|httptools],HTTP协议实现,默认为auto ws:[auto|none|websockets|wsproto],WebSocket协议实现,默认为auto ...
因此,当你尝试在新线程中调用异步函数时,就会抛出RuntimeError: There is no current event loop in thread异常,甚至你尝试打印获取当前运行的事件循环都无法获取到。如下代码所示: 复制 from fastapiimportFastAPIimportasyncio app=FastAPI()from threadingimportThread # 创建线程的模块...
uvicorn.run(app='main:app',host="0.0.0.0",log_config='./uvicorn_config.json',port=8000,loop="asyncio") 以下这段 json 实现了,格式化输出控制台,日志输出到本地文件。首先创建 uvicorn_config.json 存放项目根目录: {"version":1,"disable_existing_loggers":false,"formatters":{"default":{"()"...
():loop=asyncio.get_event_loop()awaitloop.run_in_executor(None,time.sleep(1))return{xxx}# 使用了异步方法,避免了阻塞 性能佳asyncdefxxx():awaitasyncio.sleep(1)return{xxx}# 普通函数 fastapi会将其放入线程池中运行,线程池默认配置是核心数*5,线程池用完了则等待defxxx():time.sleep(1)return{xxx...