asyncio可以实现单线程并发IO操作。如果仅用在客户端,发挥的威力不大。如果把asyncio用在服务器端,例如Web服务器,由于HTTP连接就是IO操作,因此可以用单线程+coroutine实现多用户的高并发支持。
asyncio实现了TCP、UDP、SSL等协议,aiohttp则是基于asyncio实现的HTTP框架。
我们先安装aiohttp:pip install aiohttp
案例:将网站上的照片爬取下来,
import asyncio
import aiohttp
import time
import csv
urls = [
"http://kr.shanghai-jiuxin.com/file/2021/1217/smalla6a7dd9bfaf9ee9064370426177e2ef2.jpg",
"http://kr.shanghai-jiuxin.com/file/2021/1217/smallf98c9e98a13f5495f69b26d0903b9ee3.jpg",
"http://kr.shanghai-jiuxin.com/file/2021/1217/small1ba8380b0262bf8f155bb2f2900b5f18.jpg"
]
#async异步,就记住想要使用异步协程请求时刻注意这带上async和await
async def download(url):
name = url.rsplit("/", 1)[1] #利用切片取个名字,rsplit从右切,切一次得到位置[1]的内容
async with aiohttp.ClientSession() as seccion: #创建一个异步aiohttp客户端回话
async with seccion.get(url) as resp: #此处的请求与requests请求雷同
with open(name , mode="wb") as f:
f.write(await resp.content.read()) #读取页面是异步的所以要用await挂起
print("over!!!!!!")
async def main():
task = []
for url in urls:
task.append(download(url))
await asyncio.wait(task)
if __name__ == '__main__':
#start = time.time()
asyncio.run(main())
#end = time.time()
#print (end - start) #计算程序开始到结束执行的时间