核心内容摘要
-基于JavaEE技术的电信业务信息管理系统设计与实现-任务书
文章目录
为什么需要异步
异步的好处
Python 里的 async / await示例
关键点
总结
实际应用
常见问题
被 async 修饰的函数如果直接调用会怎么样
await 是做什么的在 Python 里async/await用来写异步代码。
它们的主要作用是 让程序同时处理多个任务而不是一个个排队等。
为什么需要异步举个例子你写了一个程序要做两件事下载一个文件需要 5 秒打印 1 到 5 的数字如果用普通同步的写法importtimedefdownload_file():print(开始下载...)time.sleep(
# 模拟下载卡住 5 秒print(下载完成)defprint_numbers():foriinrange(1,
:print(i)time.sleep(
download_file()print_numbers()运行结果开始下载... 卡住 5 秒 下载完成 1 2 3 4 5问题下载的时候程序被卡住不能同时去做别的事情。
这就是同步—— 一件事没做完下一件事只能等。
异步的好处用异步就不一样了。
下载的时候程序不用干等可以去做别的事情。
等下载好了再回来继续。
这就像同步你烧水的时候站在水壶前等 5 分钟啥也不干。
异步你烧水的时候顺便去切菜、洗菜。
水开了再回来处理。
异步的目标就是提高效率。
Python 里的async/awaitasync用来定义一个异步函数叫做 coroutine 协程。
await用来等待一个异步任务完成在等待的同时程序可以去干别的事。
示例importasyncio# 定义异步函数asyncdefdownload_file():print(开始下载...)awaitasyncio.sleep(
# 模拟下载不会卡住print(下载完成)asyncdefprint_numbers():foriinrange(1,
:print(i)awaitasyncio.sleep(
# 模拟耗时操作# 主函数asyncdefmain():# 同时执行两个任务awaitasyncio.gather(download_file(),print_numbers())# 运行asyncio.run(main())运行结果开始下载... 1 2 3 4 5 下载完成你会发现数字和下载是“同时”进行的。
下载没有把程序卡死两个任务在并发执行。
关键点
总结定义异步函数asyncdeffunc():...调用异步函数时要用awaitawaitfunc()异步的好处适合 I/O 密集型任务网络请求、读写文件、数据库操作。
不适合 CPU 密集型任务比如复杂的数学计算那还是多进程更好。
asyncio.run()函数作用是运行异步的主函数参数:coro: 要运行的异步函数debugFalse: 是否开启调试模式asyncdefmain():print(Hello)asyncio.run(main())# 运行异步程序asyncio.gather()函数作用是同时运行多个异步任务参数:delay: 等待的时间单位是秒awaitasyncio.sleep(
# 等待1秒期间可以运行其他任务asyncio.gather()函数作用是并发执行多个异步任务参数:*aws: 多个异步任务用逗号分隔return_exceptionsFalse: 是否将异常作为结果返回# 同时执行3个任务等待所有完成resultsawaitasyncio.gather(task1(),task2(),task3())# 错误处理版本resultsawaitasyncio.gather(task1(),task2(),task3(),return_exceptionsTrue# 异常不会抛出而是作为结果返回)
实际应用在 Python 的一些框架中如FastAPI、aiohttp、Tornadoasync/await被用来处理高并发请求。
例如 FastAPI 里写接口时fromfastapiimportFastAPI appFastAPI()app.get(/)asyncdefhello():return{message:Hello, async world!}这里的async def就表示这个接口是异步的可以同时处理很多用户的请求而不会一个个卡着排队。
常见问题
被 async 修饰的函数如果直接调用会怎么样来看个例子importasyncioasyncdefhello():print(Hello)returnWorldresulthello()print(result)运行结果⚠️ 注意不会打印 “Hello”。
原因是async def 定义的函数调用后不会立刻执行而是返回一个 协程对象coroutine object。
这个协程对象就像一个“任务计划”要等到 await 或事件循环asyncio.run / asyncio.create_task 等驱动时才会真正执行。
所以直接调用只会得到“一个计划”而不是结果。
await 是做什么的await就是用来 等待一个异步任务协程对象完成并获取它的返回值。
它只能在async函数里使用。
继续上面的例子importasyncioasyncdefhello():print(Hello)returnWorldasyncdefmain():resultawaithello()# 这里才真正执行print(结果:,result)asyncio.run(main())输出结果Hello 结果: World流程解释hello() 返回一个协程对象。
await hello() 才会真正执行 hello() 里的代码并拿到返回值。
注意如果一个async函数没有写return那它的返回值就是None和普通函数完全一样。
点击进入我的网站