协程的意义:在一个线程中,如果遇到IO等待时间,线程不会傻等,而是利用空闲的时间自动切换到其他函数或者方法,执行别的任务。
案例:下载多个图片(会存在网络IO)
1、普通方式。利用requests。
import requests
def download_pic(url):
print("开始下载")
response = requests.get(url)
print("下载完毕。")
file_name = url.rsplit(r"&")[-1] + ".png"
with open(file_name, mode="wb")as file_object:
file_object.write(response.content)
if __name__ == '__main__':
url = "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1598762121,1909534234&fm=26&gp=0.jpg"
download_pic(url)
2、协程方式。
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import aiohttp
import asyncio
async def fetch(session, url):
print("发送请求:", url)
async with session.get(url, verify_ssl=False) as response:
content = await response.content.read()
file_name = url.rsplit('_')[-1]
with open(file_name, mode='wb') as file_object:
file_object.write(content)
print("下载完成")
async def main():
async with aiohttp.ClientSession() as session:
url_list = [
'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
'https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg',
'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg'
]
tasks = [asyncio.create_task(fetch(session, url)) for url in url_list]
await asyncio.wait(tasks)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())