- Python 基础
- Python 首页
- Python 概述
- Python 历史
- Python 特性
- Python vs C++
- Python - Hello World 程序
- Python 应用领域
- Python 解释器
- Python 环境设置
- Python 虚拟环境
- Python 基本语法
- Python 变量
- Python 数据类型
- Python 类型转换
- Python Unicode 系统
- Python 字面量
- Python 运算符
- Python 算术运算符
- Python 比较运算符
- Python 赋值运算符
- Python 逻辑运算符
- Python 位运算符
- Python 成员运算符
- Python 身份运算符
- Python 运算符优先级
- Python 注释
- Python 用户输入
- Python 数字
- Python 布尔值
- Python 控制语句
- Python 控制流
- Python 决策
- Python if 语句
- Python if else
- Python 嵌套 if
- Python match-case 语句
- Python 循环
- Python for 循环
- Python for-else 循环
- Python while 循环
- Python break 语句
- Python continue 语句
- Python pass 语句
- Python 嵌套循环
- Python 函数与模块
- Python 函数
- Python 默认参数
- Python 关键字参数
- Python 仅限关键字参数
- Python 位置参数
- Python 仅限位置参数
- Python 可变参数
- Python 变量作用域
- Python 函数注解
- Python 模块
- Python 内置函数
- Python 字符串
- Python 字符串
- Python 字符串切片
- Python 修改字符串
- Python 字符串连接
- Python 字符串格式化
- Python 转义字符
- Python 字符串方法
- Python 字符串练习
- Python 列表
- Python 列表
- Python 访问列表元素
- Python 修改列表元素
- Python 添加列表元素
- Python 删除列表元素
- Python 遍历列表
- Python 列表推导式
- Python 排序列表
- Python 复制列表
- Python 合并列表
- Python 列表方法
- Python 列表练习
- Python 元组
- Python 元组
- Python 访问元组元素
- Python 更新元组
- Python 解包元组
- Python 遍历元组
- Python 合并元组
- Python 元组方法
- Python 元组练习
- Python 集合
- Python 集合
- Python 访问集合元素
- Python 添加集合元素
- Python 删除集合元素
- Python 遍历集合
- Python 合并集合
- Python 复制集合
- Python 集合运算符
- Python 集合方法
- Python 集合练习
- Python 字典
- Python 字典
- Python 访问字典元素
- Python 修改字典元素
- Python 添加字典元素
- Python 删除字典元素
- Python 字典视图对象
- Python 遍历字典
- Python 复制字典
- Python 嵌套字典
- Python 字典方法
- Python 字典练习
- Python 数组
- Python 数组
- Python 访问数组元素
- Python 添加数组元素
- Python 删除数组元素
- Python 遍历数组
- Python 复制数组
- Python 反转数组
- Python 排序数组
- Python 合并数组
- Python 数组方法
- Python 数组练习
- Python 文件处理
- Python 文件处理
- Python 写入文件
- Python 读取文件
- Python 重命名和删除文件
- Python 目录
- Python 文件方法
- Python OS 文件/目录方法
- Python OS 路径方法
- 面向对象编程
- Python OOPs 概念
- Python 类与对象
- Python 类属性
- Python 类方法
- Python 静态方法
- Python 构造函数
- Python 访问修饰符
- Python 继承
- Python 多态
- Python 方法重写
- Python 方法重载
- Python 动态绑定
- Python 动态类型
- Python 抽象
- Python 封装
- Python 接口
- Python 包
- Python 内部类
- Python 匿名类和对象
- Python 单例类
- Python 包装类
- Python 枚举
- Python 反射
- Python 错误与异常
- Python 语法错误
- Python 异常
- Python try-except 块
- Python try-finally 块
- Python 抛出异常
- Python 异常链
- Python 嵌套 try 块
- Python 用户自定义异常
- Python 日志记录
- Python 断言
- Python 内置异常
- Python 多线程
- Python 多线程
- Python 线程生命周期
- Python 创建线程
- Python 启动线程
- Python 加入线程
- Python 线程命名
- Python 线程调度
- Python 线程池
- Python 主线程
- Python 线程优先级
- Python 守护线程
- Python 线程同步
- Python 同步
- Python 线程间通信
- Python 线程死锁
- Python 中断线程
- Python 网络编程
- Python 网络编程
- Python 套接字编程
- Python URL 处理
- Python 泛型
- Python 库
- NumPy 教程
- Pandas 教程
- SciPy 教程
- Matplotlib 教程
- Django 教程
- OpenCV 教程
- Python 杂项
- Python 日期与时间
- Python 数学
- Python 迭代器
- Python 生成器
- Python 闭包
- Python 装饰器
- Python 递归
- Python 正则表达式
- Python PIP
- Python 数据库访问
- Python 弱引用
- Python 序列化
- Python 模板
- Python 输出格式化
- Python 性能测量
- Python 数据压缩
- Python CGI 编程
- Python XML 处理
- Python GUI 编程
- Python 命令行参数
- Python 文档字符串
- Python JSON
- Python 发送邮件
- Python 扩展
- Python 工具/实用程序
- Python GUIs
- Python 高级概念
- Python 抽象基类
- Python 自定义异常
- Python 高阶函数
- Python 对象内部
- Python 内存管理
- Python 元类
- Python 使用元类进行元编程
- Python 模拟和存根
- Python 猴子补丁
- Python 信号处理
- Python 类型提示
- Python 自动化教程
- Python Humanize 包
- Python 上下文管理器
- Python 协程
- Python 描述符
- Python 诊断和修复内存泄漏
- Python 不可变数据结构
- Python 有用资源
- Python 问答
- Python 在线测验
- Python 快速指南
- Python 参考
- Python 速查表
- Python 项目
- Python 有用资源
- Python 讨论
- Python 编译器
- NumPy 编译器
- Matplotlib 编译器
- SciPy 编译器
Python 协程
Python **协程**是编程中的一个基本概念,它扩展了传统函数的功能。它们在异步编程和复杂数据处理流水线中特别有用。
**协程**是函数和生成器概念的扩展。它们旨在执行协作式多任务处理和管理异步操作。
传统函数(即子程序)只有一个入口点和一个出口点,而协程可以在多个点暂停和恢复执行,这使得它们非常灵活。
协程的关键特性
以下是 Python 中协程的关键特性:
- **多个入口点:**协程不像传统函数那样只受限于单个入口点。它们可以在遇到 `yield` 语句时暂停执行,并在稍后恢复。这允许协程处理涉及等待或处理异步数据的复杂工作流程。
- **没有中央协调器:**传统函数(即子程序)通常由主函数协调,但协程更独立地运行。它们可以以流水线的方式相互交互,数据流经一系列协程,每个协程执行不同的任务。
- **协作式多任务处理:**协程支持协作式多任务处理。这意味着它不是依赖于操作系统或运行时在任务之间切换,而是由程序员控制协程何时让出和恢复,从而允许对执行流程进行更细粒度的控制。
子程序与协程
**子程序**是具有单个入口点且没有暂停或恢复执行的固有机制的传统函数。它们按定义的顺序调用,并处理具有直接控制流的任务。
**协程**是具有多个入口点的更高级函数,可以暂停和恢复执行。它们对于需要异步执行、复杂控制流和数据流水线的任务很有用。它们通过允许程序员控制任务之间何时切换执行来支持协作式多任务处理。
下表有助于理解子程序和协程之间的关键区别和相似之处,使我们更容易掌握它们在编程中的各自作用和功能。
标准 | 子程序 | 协程 |
---|---|---|
定义 | 执行任务的一系列指令。 | 可以暂停和恢复执行的子程序的泛化。 |
入口点 | 单个入口点。 | 多个入口点;可以暂停和恢复执行。 |
执行控制 | 由主函数或控制结构调用。 | 可以暂停执行并在以后恢复,程序员控制切换。 |
用途 | 执行特定任务或计算。 | 管理异步操作、协作式多任务处理和复杂工作流程。 |
调用机制 | 通常由主函数或其他子程序调用。 | 使用`next()`、`send()`和`close()`方法调用和控制。 |
数据处理 | 没有内置的数据交换机制;通常使用参数和返回值。 | 可以使用带有`send()`的`yield`接收和处理数据。 |
状态管理 | 没有固有的机制来维护调用之间的状态。 | 在挂起之间维护执行状态,并可以从中断处恢复。 |
用法 | 这些用于将代码模块化成可管理的块。 | 这些用于异步编程、管理数据管道和协作式多任务处理。 |
并发 | 并非天生设计用于并发执行;通常用于顺序编程。 | 支持协作式多任务处理,并可以与异步任务一起工作。 |
示例用法 | 辅助函数,实用函数。 | 数据管道,异步任务,协作式多任务处理。 |
控制流 | 执行遵循代码中的线性路径。 | 执行可以根据yield点在协程之间来回跳转。 |
协程的执行
协程由__next__()方法启动,该方法启动协程并将执行推进到第一个yield语句。然后,协程等待向其发送值。send()方法用于向协程发送值,协程可以处理这些值并可能产生结果。
基本协程示例
协程使用yield语句,该语句可以发送和接收值。与生成器不同,生成器产生用于迭代的值,而协程通常使用yield接收输入并根据该输入执行操作。以下是Python协程的基本示例:
def print_name(prefix): print(f"Searching prefix: {prefix}") while True: name = (yield) if prefix in name: print(name) # Instantiate the coroutine corou = print_name("Welcome to") # Start the coroutine corou.__next__() # Send values to the coroutine corou.send("Tutorialspoint") corou.send("Welcome to Tutorialspoint")
输出
Searching prefix: Welcome to Welcome to Tutorialspoint
关闭协程
协程可以无限期运行,因此在不再需要它们时正确关闭它们非常重要。close()方法终止协程并处理清理工作。如果我们尝试向已关闭的协程发送数据,它将引发StopIteration异常。
示例
以下是 Python 中关闭协程的示例:
def print_name(prefix): print(f"Searching prefix: {prefix}") try: while True: name = (yield) if prefix in name: print(name) except GeneratorExit: print("Closing coroutine!!") # Instantiate and start the coroutine corou = print_name("Come") corou.__next__() # Send values to the coroutine corou.send("Come back Thank You") corou.send("Thank you") # Close the coroutine corou.close()
输出
Searching prefix: Come Come back Thank You Closing coroutine!!
将协程链接起来形成管道
协程可以链接在一起形成处理管道,允许数据流经一系列阶段。这对于分阶段处理数据序列特别有用,其中每个阶段执行特定任务。
示例
以下示例显示了将协程链接起来形成管道的过程:
def producer(sentence, next_coroutine): ''' Splits the input sentence into tokens and sends them to the next coroutine. ''' tokens = sentence.split(" ") for token in tokens: next_coroutine.send(token) next_coroutine.close() def pattern_filter(pattern="ing", next_coroutine=None): ''' Filters tokens based on the specified pattern and sends matching tokens to the next coroutine. ''' print(f"Searching for {pattern}") try: while True: token = (yield) if pattern in token: next_coroutine.send(token) except GeneratorExit: print("Done with filtering!!") next_coroutine.close() def print_token(): ''' Receives tokens and prints them. ''' print("I'm the sink, I'll print tokens") try: while True: token = (yield) print(token) except GeneratorExit: print("Done with printing!") # Setting up the pipeline pt = print_token() pt.__next__() pf = pattern_filter(next_coroutine=pt) pf.__next__() sentence = "Tutorialspoint is welcoming you to learn and succeed in Career!!!" producer(sentence, pf)
输出
I'm the sink, I'll print tokens Searching for ing welcoming Done with filtering!! Done with printing!
广告