import asyncio
import aiohttp
import time
import threading
# 异步利用await 阻塞,让协程跳出函数去执行其他方法
# 异步能高效地实现爬虫
def domain(number):
start = time.time()
# 声明协程函数
async def get(url):
# aiohttp 支持异步
# 通过ClientSession 声明一个会话对象
session = aiohttp.ClientSession()
# 向目标网站发起请求,通过await字符修饰协程会跳出,让第二个(3,4,..n)协程执行上面的代码
response = await session.get(url)
# # 获取当前协程数
# current_coroutines = len(asyncio.all_tasks(loop))
# print(f"Current coroutines: {current_coroutines}")
# 获取文本属于io密集型,await令协程让出cpu。
# await response.text()
# await令协程让出cpu,等待资源回收。
await session.close()
return response
async def request():
url = 'https://www.baidu.com'
# 等待其返回响应时,await令cpu让出占用权
await get(url)
# 创建任务,通过asyncio.ensure_future注册协程函数
tasks = [asyncio.ensure_future(request()) for _ in range(number)]
# 创建事件循环器
loop = asyncio.get_event_loop()
# 把批量任务通过wait添加进事件循环器,单个任务是直接用tasks的,但单个任务添加不常用
loop.run_until_complete(asyncio.wait(tasks))
end = time.time()
print(f"Number:{number},Cost time:{end-start}")
if __name__ == '__main__':
for number in [100,200,500,700]:
domain(number)