TensorFlow加载.pb模型DecodeError:从字节到版本排查
2026/11/3 22:36:09
async/await用来写异步代码。它们的主要作用是: 👉 让程序同时处理多个任务,而不是一个个排队等。举个例子:
你写了一个程序,要做两件事:
如果用普通(同步)的写法:
importtimedefdownload_file():print("开始下载...")time.sleep(5)# 模拟下载,卡住 5 秒print("下载完成!")defprint_numbers():foriinrange(1,6):print(i)time.sleep(1)download_file()print_numbers()运行结果:
开始下载... (卡住 5 秒) 下载完成! 1 2 3 4 5问题:
这就是同步—— 一件事没做完,下一件事只能等。
用异步就不一样了。下载的时候,程序不用干等,可以去做别的事情。等下载好了再回来继续。
这就像:
异步的目标就是提高效率。
async/awaitasync用来定义一个异步函数(叫做 coroutine 协程)。await用来等待一个异步任务完成,在等待的同时,程序可以去干别的事。importasyncio# 定义异步函数asyncdefdownload_file():print("开始下载...")awaitasyncio.sleep(5)# 模拟下载,不会卡住print("下载完成!")asyncdefprint_numbers():foriinrange(1,6):print(i)awaitasyncio.sleep(1)# 模拟耗时操作# 主函数asyncdefmain():# 同时执行两个任务awaitasyncio.gather(download_file(),print_numbers())# 运行asyncio.run(main())运行结果:
开始下载... 1 2 3 4 5 下载完成!你会发现:
定义异步函数
asyncdeffunc():...调用异步函数时,要用await
awaitfunc()异步的好处
asyncio.run()函数
作用是运行异步的主函数
参数:
coro: 要运行的异步函数debug=False: 是否开启调试模式asyncdefmain():print("Hello")asyncio.run(main())# 运行异步程序作用是同时运行多个异步任务
参数:
delay: 等待的时间,单位是秒awaitasyncio.sleep(1)# 等待1秒,期间可以运行其他任务作用是并发执行多个异步任务
参数:
*aws: 多个异步任务(用逗号分隔)
return_exceptions=False: 是否将异常作为结果返回
# 同时执行3个任务,等待所有完成results=awaitasyncio.gather(task1(),task2(),task3())# 错误处理版本results=awaitasyncio.gather(task1(),task2(),task3(),return_exceptions=True# 异常不会抛出,而是作为结果返回)在 Python 的一些框架中(如FastAPI、aiohttp、Tornado),async/await被用来处理高并发请求。例如 FastAPI 里写接口时:
fromfastapiimportFastAPI app=FastAPI()@app.get("/")asyncdefhello():return{"message":"Hello, async world!"}这里的async def就表示这个接口是异步的,可以同时处理很多用户的请求,而不会一个个卡着排队。
来看个例子:
importasyncioasyncdefhello():print("Hello")return"World"result=hello()print(result)运行结果:
⚠️ 注意:不会打印 “Hello”。
原因是:
所以直接调用只会得到“一个计划”,而不是结果。
await就是用来 等待一个异步任务(协程对象)完成,并获取它的返回值。它只能在async函数里使用。
继续上面的例子:
importasyncioasyncdefhello():print("Hello")return"World"asyncdefmain():result=awaithello()# 这里才真正执行print("结果:",result)asyncio.run(main())输出结果:
Hello 结果: World流程解释:
注意
如果一个async函数没有写return,那它的返回值就是None,和普通函数完全一样。
👉点击进入我的网站