python 异步 I/O

news/2024/11/30 0:41:31/

如果你想了解异步编程,那么必然会涉及出许多相关概念。

  • 堵塞/非堵塞
  • 同步/异步
  • 多进程/多线程/协程

为什么我要学习这个话,因为我想搞懂异步框架和异步接口的调用。所以,我的学习路线是这样的:

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 timedef 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 timeasync 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 task1await task2print(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())

运行结果同上,这里就不再贴了。


http://www.ppmy.cn/news/564675.html

相关文章

优思学院|作业标准和标准化作业有何区别?傻傻搞不清?

作业标准和标准作业是两个在生产和制造环境中具有重要意义的概念。尽管它们看似相似,但实际上它们在定义、目的和实施方法上存在显著差异。本文将探讨作业标准和标准作业的区别,以及它们在工作场所中的作用和重要性。 1. 引言 在制造领域中&#xff0c…

securecrt密码与账户正确却登不上ubuntu

我的账户名为hadoop如下: 于是尝试用这个账户名和密码去登录ssh报错: 根本原因在于这个username是错的,应该用控制台中的名字 : ps: 密码是一样的

登不上192.168.***.***:50070

登不上192.168.***.***:50070 一、centos如果登不上192.168.***.***:50070页面,关闭防火墙 systemctl stop firewalld二、windows上登不上192.168.***.***:50070 原因:未关闭防火墙 在使用service iptables status查看防火墙状态时出现 Redirecting …

迅雷的问题?

昨天用迅雷下载,一个3.3G的的文件,不知道速度太快,还是英文版的vista和迅雷不兼容.速度10M/S就死机. 然后只好用IE下,呵呵也快啊.要是都是学校里这速度就好了 。 羡慕吧!!

谷歌浏览器Chrome不能登录不能同步解决方法

参考链接: 参考1 参考2 1、下载一个chrome插件,链接:点击下载插件 密码:p0kc 2、将下载的.CRX格式的插件修改成.zip(或.rar)格式的文件。 3、对该zip文件解压缩,得到一个文件夹。(打开文件夹&am…

解决google浏览器无法登录及同步

步骤 使用谷歌插件:Chrome-Sync-Helper(百度云资源在文末) 1、解压压缩文件。 2、点击拓展程序,让google绑定该插件。 3、然后登录下google账号,就可以使用同步功能了。 4、从下面链接提取google插件【Chrome-Sync…

三大云平台的数据库方面

一、阿里云 关系型数据库 云原生数据库PolarDB MySQL 版 阿里云自研产品,100%兼容 MySQL。产品具有多主多写、多活容灾、HTAP特性,交易性能最高可达开源数据库的6倍,分析性能最高可达开源数据库的400倍,TCO 低于自建数据库50% 云…

迅雷iOS端安装 - iPhone安装手机迅雷

方法 1. 使用浏览器Safari打开网址: https://m.xunlei.com/ 2. "立即安装内测版" 3. 安装好APP之后,信任此APP: (1)设置 (2)通用 (3)描述文件与设备管理 (4)企业级应用 > Xikuang information Tech... (5)点击“信任Xi…