接上篇帖子:https://www.52pojie.cn/thread-1596989-1-1.html
'''
在前面的代码中,我们用一个网络请求作为例子,这本身就是一个耗时的等待操作,因为
在请求网页之后需要等待页面响应并返回结果。耗时等待操作一般都是IO操作,例如文件读取、
网络请求等。协程在处理这种操作时是有很大优势的,当遇到需要等待的情况时,程序可以暂时挂起,
转而执行其他操作,从而避免因一直等待一个程序儿耗费过多的时间,能够充分利用资源
要实现异步,需要了解await关键字的用法,它可以将耗时等待的操作挂起,让出控制权。
如果协程在执行的时候遇到await,事件循环就会将本协程挂起,转而执行别的协程,直到
其他协程挂起或执行完毕。
await后的对象必须是如下格式之一:
一个原生协程对象
一个由type。coroutine修饰的生成器,这个生成器可以反回协程对象
由一个包含__await__方法的对象返回的迭代器
requests返回的对象不能和await一起使用。只有使用支持异步请求操作的请求方式才可以实现真正的异步,aiohttp
'''[Python] 纯文本查看 复制代码 import asyncioimport aiohttp
import time
start = time.time()
async def get(url):
session = aiohttp.ClientSession()
response = await session.get(url) # 利用aiohttp库里ClientSession类的get方法进行请求。
await response.text()
await session.close()
return response
async def request():
url = 'http://www.httpbin.org/delay/5'
print('Waiting for',url)
respones = await get(url)
print('Get response from',url,'response',respones)
tasks = [asyncio.ensure_future(request()) for _ in range(10)]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))
end = time.time()
print('Cost time:',end - start) |