协程
使用场景:I/O密集型任务
关键优势:
1.单线程处理大量并发,避免线程切换开销
2.高效利用I/O等待时间,提升吞吐量
来源:
1.由于多进程/多线程由计算机系统调度,调度资源损耗大
2.程序本身去控制执行流程,切换资源使用少
思想:通过异步机制,实现多任务的同步执行,基于事件循环
核心机制:通过await主动让出主动权,仅在需要时恢复执行
最佳实践:
1.生成器+协程:数据采集与处理
2.异步+协程
示例:执行到await response.text()时,将主动权交给事件循环,当response.text()处理完,再回到此处,(先response.text()再协程暂停,释放主动权)
async def fetch(url): async with aiohttp.ClientSession() as session: async with session.get(url) as response: return await response.text() # 1000个并发请求仅需1个线程 tasks = [fetch(url) for url in urls] asyncio.run(asyncio.gather(*tasks))
优化:
async def fetch(url, semaphore):
async with semaphore:
async with aiohttp.ClientSession() as session:
return await session.get(url)
semaphore = asyncio.Semaphore(100) # 限制100个并发
tasks = [fetch(url, semaphore) for url in urls]

前提基础:事件
1.启动事件循环,完成任务调度,事件循环也是异步的基础
2.事件循环本质是三个队列中的任务调用执行,工作机制是将代码逻辑转换为事件并调度执行
3.“同步代码优先执行 → 异步操作注册事件 → 事件就绪后加入任务队列 → 事件循环依次处理队列中的任务”。----同步代码先执行,遇到异步/协程等注册到事件中,同步代码执行完,事件循环处理注册的异步任务
4.扩展知识:有些信号处理机制,由系统内核控制,不占用主线程资源,可以对主线程的运行进程操控,比如中断处理,插入信号函数执行,然后在恢复主线程

浙公网安备 33010602011771号