协程

使用场景: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.扩展知识:有些信号处理机制,由系统内核控制,不占用主线程资源,可以对主线程的运行进程操控,比如中断处理,插入信号函数执行,然后在恢复主线程

 

 

 
posted @ 2025-05-21 16:44  江湖一支竹  阅读(13)  评论(0)    收藏  举报