单线程+异步协程
event_loop :时间循环,相当于一个无限循环,我们可以把一些函数注册到这个事件循环上,当满足某些条件时,函数就会被执行
corouteine:协程对象,我们可以将协程对象注册到事件循环中,它会被事件循环调用。我们可以使用 async 关键字来定义一个方法,这个方法在调用时不会立即执行,而是返回一个协程对象。
task:任务,它是对协程对象的进一步封装,包含了任务的各个状态
future:代表将来执行火还没有执行的任务,实际上和task没有本质区别
asnyc 定义一个协程
await 用来挂起阻塞方法的执行
import asycio
def request():
print('',url)
c=request('www.xxx.com') #内部的程序语句不会马上执行
#创建一个事件循环对象
loop=asyncio.get_event_loop()
#将协程对象注册到loop中,然后启动loop
loop.run_until_complete(c)
task的使用
loop =asyncio.get_event_loop()
#基于loop创建一个task对象
loop.create_task(c)
loop.run_until_complete(task)
future的使用
loop =asyncio.get_event_loop()
task=asyncio.ensure_future(c)
loop.run_until_complete(task)
绑定回调
当任务对象相应成功只会,执行一定操作
def callback(task):
print(task.result())
loop =asyncio.get_event_loop()
task=asyncio.ensure_future(c)
#将回调函数绑定到任务对象中
task.add_done_callback(callback)
#默认将任务对象作为参数传递给回调函数
loop.run_until_complete(task)
多任务异步协程
import asyncio
import time
def request(url):
print("...",url)
#在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。
#time.sleep(2) 不可用
#当在asyncio遇到阻塞操作必须进行手动挂起,使用await
await acyncio.sleep(2)
print("over",url)
st=time.time()
urls=[
'www.baidu.com',
'www.sougou.com',
'www.douban.com'
]
#任务列表:存放多个任务对象
stask=[]
for i in urls :
c=request(url)
task=asyncio.ensure_future(c)
stask.append(task)
loop=asyncio.get_event_loop()
#需要将任务列表封装到wait中
loop.run_until_complete(asyncio.wait(stasks))
ov=time.time()
print(ov-st)
aiohttp模块
环境安装 : pip install aiohttp
使用该模块中的session对象中的clientsession
async def getpage(url):
async with aiohttp.ClientSession() as seesion :
#get/post 请求发送
#添加headers参数伪装 请求参数 get params/post data
async with await session.get(url,headers=headers) as response :
#text()方法可以返回字符串形式数据
#read()方法返回二进制数据
#json()方法返回json对象
#在获取响应数据操作之前一定要使用await进行手动操作挂起
page_text =await reponse.text()
print(page_text)
stask=[]
for i in urls :
c=request(url)
task=asyncio.ensure_future(c)
stask.append(task)
loop=asyncio.get_event_loop()
#需要将任务列表封装到wait中
loop.run_until_complete(asyncio.wait(stasks))
ov=time.time()
print(ov-st)