python 异步 I/O
2020-04-22 22:31 虫师 阅读(5814) 评论(2) 编辑 收藏 举报如果你想了解异步编程,那么必然会涉及出许多相关概念。
- 堵塞/非堵塞
- 同步/异步
- 多进程/多线程/协程
为什么我要学习这个话,因为我想搞懂异步框架和异步接口的调用。所以,我的学习路线是这样的:
1.python异步编程
2.python Web异步框架(tornado/sanic)
3.异步接口调用(aiohttp/httpx)
那么异步编程有什么好处?在某些场景下它可以提高性能。我们知道CPU的速度快于磁盘、网络等IO。一旦遇到IO操作,如读写文件、发送网络数据时,就需要等待IO操作完成,才能进行下一步操作。这种情况称为同步IO。我们可以使用多线程来解决这类问题,另一种方式是通过异步。
python在3.4版本引入asyncio,到 3.5版本又加入async/await来简化异步的使用。
先来举个简单的例子,假如,你和女朋友逛街。你的目的是去看新上市的华为P40手机,而你女朋友是去看新款的衣服。你们的逛街流程是这样的。
import time
def clothes_shop():
print("女朋友看衣服..")
time.sleep(8)
print("...出来了")
def huawei_shop():
print("体验手机..")
time.sleep(5)
print("...出来了")
print(time.ctime(), "开始逛街")
clothes_shop()
huawei_shop()
print(time.ctime(), "结束.")
运行结果:
Thu Apr 16 00:08:22 2020 开始逛街
女朋友看衣服..
...出来了
体验手机..
...出来了
Thu Apr 16 00:08:35 2020 结束.
假设单位是分钟,你们总共耗时13分钟。
接下来,看看用异步是如何处理的:
import asyncio
import time
async def shop(delay, what):
print(what)
await asyncio.sleep(delay)
print("...出来了")
async def main():
task1 = asyncio.create_task(shop(8, '女朋友看衣服..'))
task2 = asyncio.create_task(shop(5, '体验手机..'))
print(time.ctime(), "开始逛街")
await task1
await task2
print(time.ctime(), "结束.")
asyncio.run(main())
通过 async/await 语法进行声明,是编写 asyncio 应用的推荐方式。
- async 声明一个函数为异步函数。
- await 声明处理比较耗费时的动作。
- asyncio.run() 函数用来运行最高层级的入口点 main() 函数。
- asyncio.create_task() 函数用来并发运行作为 asyncio 任务 的多个协程。
其实,思路非常简单,就是你和女朋友各逛各自的,先出来的等等对方。
严重警告!提醒广大直男,现实生活中千万不要这么思考问题。一定要陪女朋友一起看衣服,还要主动去付钱。
来看看运行结果:
Thu Apr 16 00:19:19 2020 开始逛街
女朋友看衣服..
体验手机..
...出来了
...出来了
Thu Apr 16 00:19:27 2020 结束.
假设单位是分钟,只需要8分钟搞定。
通过上面的例子,可以看到 task1、task2仍然有前后顺序,这种前后顺序的时间可以忽略不计。但是,我们也是可以使用asyncio.gather()方法并发运行任务。
#……
async def main():
print(time.ctime(), "开始逛街")
await asyncio.gather(
shop(8, '女朋友看衣服..'),
shop(5, '体验手机..')
)
print(time.ctime(), "结束.")
asyncio.run(main())
运行结果同上,这里就不再贴了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2015-04-22 bootstrap精简教程