当前位置: 首页 > ds >正文

Python协程入门指北

一、什么是协程?

协程(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密集型任务

六、优化

  1. 避免阻塞操作:用await asyncio.sleep()代替time.sleep()
  2. 限制并发量
sem = asyncio.Semaphore(10)  # 最多同时10个async def limited_task():async with sem:await heavy_work()
  1. 使用结构化并发(Python 3.11+):
async with asyncio.TaskGroup() as tg:tg.create_task(task1())tg.create_task(task2())

备注

个人水平有限,有问题随时交流~

http://www.xdnf.cn/news/3566.html

相关文章:

  • 深度学习系统学习系列【1】之基本知识
  • watch 数组 Vue 3
  • 第七章:赤 色广播计划的全面启动
  • Java面试高频问题(31-33)
  • Selenium3自动化测试,Python3测试开发教程视频测试用例设计
  • 2025年渗透测试面试题总结-拷打题库30(题目+回答)
  • 【算法扩展】斐波那契查找算法 - JAVA
  • Python地图绘制模块cartopy入门
  • 跨境电商物流革命:俄罗斯市场8000节点布局深度解析与卖家实战策略
  • Learning vtkjs之OBBTree
  • 油气地震资料数据中“照明”的含义
  • 2024 网络安全回顾与 2025 展望:守护数字世界的新征程
  • 2025五一杯数学建模竞赛C题 社交媒体用户分析 保姆级教程讲解|模型讲解
  • 【Leetcode 每日一题】2071. 你可以安排的最多任务数目
  • 【瑞萨RA4L1-SENSOR套件测评】LCD 自定义数字显示
  • Adam(Adaptive Moment Estimation)
  • windows电脑端SSH连接开termux的安卓端
  • 字符串格式漏洞-[第五空间2019 决赛]PWN5
  • 【 Node.js】 Node.js安装
  • 【无标题】linux的多进程讲解
  • C#中的LINQ:简化数据查询与操作
  • 梳理顶会论文相关的经验贴
  • Linux Shell 重定向与管道符号(>, >>, |)的实现机制
  • GD32F407单片机开发入门(二十五)HC-SR04超声波模块测距实战含源码
  • epoll函数
  • Perforated Backpropagation:神经网络优化的创新技术及PyTorch使用指南
  • TensorFlow深度学习实战——基于循环神经网络的情感分析模型
  • 多模态大语言模型arxiv论文略读(五十二)
  • LangChain4j +DeepSeek大模型应用开发——6 提示词
  • Nginx 核心功能02