一、同步IO和异步IO
同步IO:主线程阻塞,需要等待IO操作完成,才能继续进行下一步操作
异步IO:当遇到IO阻塞,主线程并不等待IO的结果,而是去执行其他代码,当IO返回结果时,再返回进行处理
注意:
1. 同步IO影响并发,可以通过多线程和多进程解决,但是过多的线程或进程会导致CPU的消耗花费在线程或进程的切换上,导致真正花在CPU的时间减少
2. 协程: 协程是在一个线程中执行,与多线程相比,少了线程切换,所以效率高
3. 协程不需要有锁机制。因为只有一个线程,不存在同时写变量的冲突
二、Python异步实现
Python异步IO的逻辑:在消息循环体中,主线程不断地重复读取消息、处理消息这个过程
import requests
import time
import asyncio
import aiohttp
urls = [
'http://172.23.1.229:8000/bob',
'http://172.23.1.229:8000/tim',
'http://172.23.1.229:8000/luo'
]
#
async def get_info(url):
print("准备开始下载: ",url)
#在协程中,不能使用同步代码。而request.get()是同步代码
# res = requests.get(url)
# print(res.text)
async with aiohttp.ClientSession() as session:
#get(),post(),headers,params,data
async with await session.get(url=url) as res:
#text(): 返回字符串
#read(): 返回二进制
#json():返回json
#获取响应数据之前, 一定要使用await手动挂起
content = await res.text()
print("{}下载完成,内容为: {}".format(url,content))
#定义任务列表
task_list = []
#定义任务
for url in urls:
c = get_info(url)
task = asyncio.ensure_future(c)
task_list.append(task)
#执行任务
start_time = time.time()
#定义事件循环
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(task_list))
end_time = time.time()
print(end_time-start_time)