## 1、同步和异步的区别
- **同步**: 所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉
- **异步**: 不等所有操作做完 ,就返回给用户。操作已经启动程序会将它加到消息队列当中,慢慢执行,不会给用户卡死的感觉
## 2、使用Asynico 进行异步编程
- Asynico - 异步 I/O
- asyncio 是用来编写 **并发** 代码的库,使用 **async/await** 语法。
- asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。
- asyncio 往往是构建 IO 密集型和高层级 **结构化** 网络代码的最佳选择。
> python 3.5 后才可以使用async/await 语法
### 异步请求图片示例:
安装异步http 请求库
```sh
$ pip install aiohttp
```
- 导入 asyncio 以及异步请求aiohttp
```python
# !/usr/bin/env python
import asyncio
import aiohttp
```
- fetch
```python
async def fetch(session, url):
async with session.get(url, headers={
"referer": "https://www.mzitu.com/",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36"
}) as response:
return await response.read()
```
- download_image()
```python
async def download_image(url):
async with aiohttp.ClientSession() as session:
result = await fetch(session, url)
with open(url.split("/")[-1], 'wb') as f:
f.write(result)
f.close()
```
- __main()__
```python
if __name__ == '__main__':
# 添加多个任务
tasks = [
asyncio.ensure_future(download_image("https://csdnimg.cn/cdn/content-toolbar/csdn-logo.png?v=20200416.1")),
asyncio.ensure_future(download_image("https://csdnimg.cn/public/common/toolbar/images/csdnqr@2x.png"))
]
# 打开时间循环
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.gather(*tasks))
```
## 参考
[https://docs.python.org/zh-cn/3/library/asyncio.html](https://docs.python.org/zh-cn/3/library/asyncio.html)
[https://docs.aiohttp.org/en/stable/](https://docs.aiohttp.org/en/stable/)