公司建设网站需要注意什么,广西网站建设策划,重庆网站营销案例,网站客户案例的一、什么是协程#xff1f;
协程#xff08;Coroutine#xff09;就像可以暂停执行的函数#xff0c;能够在执行过程中主动让出控制权#xff0c;等准备好后再继续执行。
生活小例子
想象你在咖啡店排队#xff1a;
普通函数#xff1a;必须一直排到取餐#xff08…一、什么是协程
协程Coroutine就像可以暂停执行的函数能够在执行过程中主动让出控制权等准备好后再继续执行。
生活小例子
想象你在咖啡店排队
普通函数必须一直排到取餐阻塞等待协程下单后去旁边座位等轮到你再回来取非阻塞
二、快速入门
1. 最简单的协程
import asyncioasync def hello():print(开始)await asyncio.sleep(1) # 暂停1秒print(结束)asyncio.run(hello()) # 运行协程2. 并发执行多个协程
async def make_coffee(name, time):print(f{name}开始制作)await asyncio.sleep(time)print(f{name}制作完成)async def main():# 同时制作三杯咖啡await asyncio.gather(make_coffee(拿铁, 2),make_coffee(美式, 1),make_coffee(卡布, 3))asyncio.run(main())输出顺序美式 → 拿铁 → 卡布总耗时3秒
三、核心概念
1. 关键字解析
关键字作用说明示例async定义协程函数async def func():await暂停等待异步操作await task()run()启动协程的主入口asyncio.run(main())
2. 协程 vs 多线程
协程多线程内存占用约1KB/任务约8MB/线程切换速度100纳秒级1微秒级适用场景I/O密集型任务CPU密集型任务
四、实战应用
1. 网络请求并发
import aiohttpasync def fetch(url):async with aiohttp.ClientSession() as session:async with session.get(url) as response:return await response.text()async def main():urls [url1, url2, url3]results await asyncio.gather(*[fetch(url) for url in urls])print(f获取到{len(results)}个结果)asyncio.run(main())2. 生产者-消费者模式
async def producer(queue):for i in range(5):await queue.put(i)print(f生产产品{i})await asyncio.sleep(0.5)async def consumer(queue):while True:item await queue.get()print(f消费产品{item})queue.task_done()async def main():queue asyncio.Queue(3) # 最大容量3await asyncio.gather(producer(queue),consumer(queue))asyncio.run(main())五、常见问题
1. 为什么我的协程不执行
忘记使用await调用协程没有通过asyncio.run()启动在普通函数中调用协程
2. 如何停止无限循环的协程
task asyncio.create_task(infinite_task())
await asyncio.sleep(5)
task.cancel() # 5秒后取消任务3. 协程会替代多线程吗
适合网络请求、文件IO、Web服务等I/O密集型场景不适合科学计算、图像处理等CPU密集型任务
六、优化
避免阻塞操作用await asyncio.sleep()代替time.sleep()限制并发量
sem asyncio.Semaphore(10) # 最多同时10个async def limited_task():async with sem:await heavy_work()使用结构化并发Python 3.11
async with asyncio.TaskGroup() as tg:tg.create_task(task1())tg.create_task(task2())备注
个人水平有限有问题随时交流~