asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
    asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。

    我们先安装aiohttp:pip install aiohttp

    案例:将网站上的照片爬取下来,

    1. import asyncio
    2. import aiohttp
    3. import time
    4. import csv
    5. urls = [
    6. "http://kr.shanghai-jiuxin.com/file/2021/1217/smalla6a7dd9bfaf9ee9064370426177e2ef2.jpg",
    7. "http://kr.shanghai-jiuxin.com/file/2021/1217/smallf98c9e98a13f5495f69b26d0903b9ee3.jpg",
    8. "http://kr.shanghai-jiuxin.com/file/2021/1217/small1ba8380b0262bf8f155bb2f2900b5f18.jpg"
    9. ]
    10. #async异步,就记住想要使用异步协程请求时刻注意这带上async和await
    11. async def download(url):
    12. name = url.rsplit("/", 1)[1] #利用切片取个名字,rsplit从右切,切一次得到位置[1]的内容
    13. async with aiohttp.ClientSession() as seccion: #创建一个异步aiohttp客户端回话
    14. async with seccion.get(url) as resp: #此处的请求与requests请求雷同
    15. with open(name , mode="wb") as f:
    16. f.write(await resp.content.read()) #读取页面是异步的所以要用await挂起
    17. print("over!!!!!!")
    18. async def main():
    19. task = []
    20. for url in urls:
    21. task.append(download(url))
    22. await asyncio.wait(task)
    23. if __name__ == '__main__':
    24. #start = time.time()
    25. asyncio.run(main())
    26. #end = time.time()
    27. #print (end - start) #计算程序开始到结束执行的时间