面试题答案
一键面试- 引入必要的库:
- 在Python中,
aiohttp
库用于处理异步HTTP请求,asyncio
库用于管理协程。
import asyncio import aiohttp
- 在Python中,
- 定义一个异步函数来处理单个HTTP请求:
- 这里定义一个
fetch
函数,它接收一个URL作为参数。 - 在函数内部,使用
aiohttp.ClientSession
来创建一个会话,这个会话用于发送HTTP请求。 async with
语句确保会话在使用完毕后正确关闭。- 使用
session.get
方法发送GET请求,并通过await
等待请求完成,获取响应。 - 最后返回响应的文本内容。
async def fetch(session, url): async with session.get(url) as response: return await response.text()
- 这里定义一个
- 定义一个主函数来管理多个请求:
- 定义
main
函数,在函数内部创建一个aiohttp.ClientSession
对象。 - 创建一个任务列表
tasks
,通过循环遍历URL列表,为每个URL创建一个fetch
任务,并添加到任务列表中。 - 使用
await asyncio.gather(*tasks)
来并发执行所有任务,并等待所有任务完成,收集所有任务的结果。
async def main(urls): async with aiohttp.ClientSession() as session: tasks = [] for url in urls: task = asyncio.create_task(fetch(session, url)) tasks.append(task) results = await asyncio.gather(*tasks) return results
- 定义
- 运行主函数:
- 定义一个URL列表
urls
。 - 使用
asyncio.run(main(urls))
来运行main
函数,从而启动整个异步爬虫流程。
if __name__ == '__main__': urls = ['http://example.com', 'http://example.org', 'http://example.net'] asyncio.run(main(urls))
- 定义一个URL列表
在上述代码中,协程的使用使得在处理HTTP请求时,程序不会阻塞等待请求完成,而是可以在等待I/O操作(如网络请求)的过程中切换到其他任务,从而提高了整体的效率,实现了高效的异步I/O操作。