关键代码结构
- 导入必要的库:
import asyncio
import aiohttp
- 定义下载函数:
async def download(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
return await response.text()
- 定义解析函数:
def parse(html):
# 这里编写具体的解析逻辑,例如使用BeautifulSoup等库
pass
- 定义主函数并管理任务:
async def main(urls):
tasks = []
for url in urls:
task = asyncio.create_task(download(url))
tasks.append(task)
results = await asyncio.gather(*tasks)
for html in results:
parse(html)
- 运行主函数:
if __name__ == "__main__":
urls = ["url1", "url2", "url3"] # 替换为实际的URL列表
asyncio.run(main(urls))
原理
- 事件循环:
asyncio
库使用事件循环(event loop
)来管理异步任务。事件循环不断检查任务队列,当某个任务的I/O操作完成(如网络请求返回数据),该任务就会被重新安排执行。
- 协程定义:使用
async def
定义的函数是一个协程,协程函数在调用时不会立即执行,而是返回一个协程对象。
await
关键字:在协程内部,await
用于暂停协程的执行,等待一个Future
对象(通常是I/O操作的结果)完成,然后恢复协程执行并返回Future
的结果。
- 任务管理:
asyncio.create_task
用于将协程包装成一个任务(Task
对象)并加入事件循环的任务队列。asyncio.gather
用于等待所有给定的任务完成,并返回所有任务的结果。
- 异步I/O操作:通过
aiohttp
库实现异步的HTTP请求,在等待网络响应的过程中,事件循环可以切换到其他任务执行,从而实现高效的并发操作,提高整体效率。