赞
踩
asyncio模块,可以帮我们检测阻塞,实现应用程序级别的切换。
在函数定义前添加一个async关键字,该函数就变成了特殊函数。
a.特殊函数被调用之后,函数内部的程序语句不会被立即执行
b.特殊函数被调用后,会返回一个协程对象
async def get_request(url):
print('正在请求的网址是:',url)
await asyncio.sleep(2)
print('网址请求结束')
return 123
协程=特殊函数=函数=一组指定形式的操作
协程的本质就是一组指定形式的操作(一个任务)。
def myAdd(a,b):
c=a+b
return c
任务对象本质是一个高级的协程。
任务对象=高级协程=协程=一组指定形式的操作
a.可以给任务对象绑定一个回调函数
回调函数:回调调用的函数,该函数一定是在任务对象被执行完毕后再回调/调用。
asyncio.ensure_future()
当做是一种容器。该容器是用来装载多个任务对象。
loop就可以将其内部装载的任务对象进行异步的执行。
# 创建事件循环对象loop
loop = asyncio.get_event_loop()
# 将一个任务对象装载在了loop中,并且启动loop
loop.run_until_complete(task)
代码理解
import asyncio import time # 1.特殊函数 async def get_request(url): print('正在请求的网址是:',url) time.sleep(2) print('结束') return 123 # 2.特殊函数的调用:返回/创建一个协程对象 c =get_request('www.1.com') print(c) # 3.创建任务对象:高级协程 task = asyncio.ensure_future(c) # 4.创建事件循环对象loop loop = asyncio.get_event_loop() # 将一个任务对象装载在了loop中,并且启动loop loop.run_until_complete(task)
结果:
import asyncio import time ''' 回调函数 任务对象给自己绑定回调函数 ''' # 1.创建一个任务对象 async def get_request(url): print('正在请求的网址是:',url) time.sleep(2) print('结束') return 123 # 2.调用任务对象:返回协程 # 2.1 使用任务对象使用回调函数来获取特殊函数的内部返回值 c = get_request('www.1.com') # 2.2 对任务对象绑定一个回调函数(该函数一定是在任务对象被执行完毕后再回调/调用) task = asyncio.ensure_future(c) # 3.创建回调函数(必须有且仅有一个参数!) def task_callback(t): # 函数的参数t就是回调函数的调用这task任务对象本身 # 任务对象调用result()就可以放回特殊函数的内部值 ret = t.result() print('我是回调函数,我被执行了,t.result()返回的结果是:',ret) # 3.1 给task任务对象绑定一个回调函数task_callback task.add_done_callback(task_callback) # 4.创建一个loop loop = asyncio.get_event_loop() # 4.1启动loop loop.run_until_complete(task)
结果:
小结:
由上面的两个结果显示可知,没有使用回调函数时,特殊函数不会立即执行内部程序,而直接请求结束;当使用了回调函数时,任务对象被调用后再回调执行函数内部程序返回123
体会一下当特殊函数内部出现不支持异步模块的代码,会中断整个异步效果
time.sleep(2) #不支持异步效果
import asyncio import time start = time.time() # 1.创建一个任务对象 ''' 注意:特殊函数内部不可以出现不支持异步模块的代码,否则会中断整个异步效果 ''' async def get_request(url): print('正在请求的网址是:',url) time.sleep(2) #不支持异步效果 # asyncio.sleep(2) print('网址请求结束') return 123 urls = ['www.1.com','www.2.com','www.3.com'] # 定义一个任务列表 tasks = [] for url in urls: # 创建3个协程 c = get_request(url) # 创建3个任务对象 task = asyncio.ensure_future(c) # 存放3个任务对象到任务列表中 tasks.append(task) # 创建一个容器来存放任务列表 loop = asyncio.get_event_loop() ''' asyncio.wait()函数:用于接收一个任务列表,可以给每一个任务对象赋予被挂起的权限 一个任务被挂起,就表示当前任务对象交出了cpu的使用权,cpu就可以执行其他任务 [task1,task2,task3] ''' loop.run_until_complete(asyncio.wait(tasks)) print('耗时:',time.time()-start)
结果:
await asyncio.sleep(2) # 支持异步效果
import asyncio import time start = time.time() # 1.创建一个任务对象 ''' 注意:特殊函数内部不可以出现不知异步模块的代码,否则会中断整个异步效果 time.sleep(2) #不支持异步效果 没有加await之前:每一个任务中的阻塞操作并没有被执行 await关键字:必须要加在每一个任务的阻塞操作前,强调执行阻塞操作 await用来手动控制任务的挂起操作 ''' async def get_request(url): print('正在请求的网址是:',url) # time.sleep(2) #不支持异步效果 await asyncio.sleep(2) print('网址请求结束') return 123 urls = ['www.1.com','www.2.com','www.3.com'] # 定义一个任务列表 tasks = [] for url in urls: # 创建3个协程 c = get_request(url) # 创建3个任务对象 task = asyncio.ensure_future(c) # 存放3个任务对象到任务列表中 tasks.append(task) # 创建一个容器来存放任务列表 loop = asyncio.get_event_loop() ''' asyncio.wait()函数:用于接收一个任务列表,可以给每一个任务对象赋予被挂起的权限 一个任务被挂起,就表示当前任务对象交出了cpu的使用权,cpu就可以执行其他任务 [task1,task2,task3] ''' loop.run_until_complete(asyncio.wait(tasks)) print('耗时:',time.time()-start)
结果:
小结:
当特殊函数中出现不支持异步的函数,就不能实现异步效果
发起请求是阻塞,获取响应是阻塞
爬取自己服务器的页面数据,并将其进行数据解析操作
aiohttp模块是一个基于网络请求的模块,功能和requests模块相似,但是requests不支持异步,而aiohttp支持异步。
pip install aiohttp
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。