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)