- Python 菜鸟教程
- Python 教程
- Python - 概述
- Python - 历史
- Python - 特性
- Python 与 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 - 元组(Tuple )
- Python - 访问元组项
- Python - 更新元组
- Python - 解压缩元组项
- Python - 循环元组
- Python - 联接元组
- Python - 元组方法
- Python - 元组练习
- Python 集
- Python - 集(sets)
- Python - 访问 Set Items
- Python - 添加 Set Items
- Python - 删除 Set Items
- Python - 循环 Set Items
- Python - 联接 Sets
- Python - 复制 Set
- Python - Set 运算符
- Python - Set 方法
- Python - Set 的练习
- 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.path 方法
- 面向对象编程
- Python - OOP 概念
- 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 杂项
- Python - 日期和时间
- Python - math 模块
- Python - 迭代器
- Python - 生成器
- Python - 闭包(closures)
- Python - 装饰器( Decorators)
- 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 - 图形用户界面
- Python 高级概念
- Python - 抽象基类
- Python - 自定义异常
- Python - 高阶函数
- Python - 对象内部
- Python - 内存管理
- Python - 元类
- Python - 使用 Metaclasses 进行元编程
- Python - 模拟和存根
- Python - 猴子修补
- Python - 信号处理
- Python - 类型提示
- Python - 自动化教程
- Python - 人性化软件包
- Python - 上下文管理器
- Python - 协程
- Python - 描述符
- Python - 诊断和修复内存泄漏
- Python - 不可变数据结构
Python - 协程
Python 协程是编程中的一个基本概念,它扩展了传统函数的功能。它们对于异步编程和复杂的数据处理管道特别有用。
协程是函数和生成器概念的扩展。它们旨在执行协作式多任务处理和管理异步操作。
在传统函数中,即具有单个入口和出口点的子例程,而协程可以通过使其高度灵活,在不同点暂停和恢复执行。
协程的主要特性
以下是 python 中协程的主要特征 -
- 多个入口点:协程不像传统函数那样局限于单个入口点。他们可以在某些时候暂停执行,当他们点击 yield 语句时,稍后继续执行。这允许协程处理涉及等待或处理异步数据的复杂工作流。
- 无中央协调器:当我们看到传统函数时,即子例程,它们通常由主函数协调,但协程更独立地运行。它们可以以流水线方式相互交互,其中数据流经一系列协程,每个协程执行不同的任务。
- 协作多任务处理:协程支持协作式多任务处理。这意味着,程序员通过允许对执行流进行更精细的控制,来控制协程何时生成和恢复,而不是依赖操作系统或运行时在任务之间切换。
子例程 VS. 协程
子例程是具有单个入口点的传统函数,没有用于暂停或恢复执行的固有机制。它们按定义的顺序调用,并通过简单的控制流处理任务。
协程是具有多个入口点的高级函数,可以暂停和恢复其执行。它们对于需要异步执行、复杂控制流和数据管道的任务非常有用。它们通过允许程序员控制何时在任务之间切换来支持协作式多任务处理。
下表有助于理解子例程和协程之间的主要区别和相似之处,让我们更容易掌握它们在编程中各自的角色和功能。
标准 | 子 例 程 | 协程 |
---|---|---|
定义 | 执行任务的指令序列。 | 可以暂停和恢复执行的子例程的泛化。 |
入场点 | 单一入口点。 | 多个入口点;可以暂停和恢复执行。 |
执行控制 | 由 main 函数或 control structure 调用。 | 这些可以暂停执行并在以后恢复,并且程序员可以控制切换。 |
目的 | 执行特定任务或计算。 | 管理异步操作、协作式多任务处理和复杂的工作流程。 |
调用机制 | 通常由 main 函数或其他子例程调用。 | 使用 'next()'、'send()' 和 'close()' 方法调用和控制。 |
数据处理 | 没有用于处理数据交换的内置机制;通常使用参数和返回值。 | 可以使用 'yield' 和 'send()' 接收和处理数据。 |
状态管理 | 没有在调用之间维护状态的固有机制。 | 在暂停之间保持执行状态,并且可以从中断的位置恢复。 |
用法 | 这些用于将代码模块化为可管理的块。 | 这些用于异步编程、管理数据管道和协作式多任务处理。 |
并发 | 本质上不是为并发执行而设计的;通常用于顺序编程。 | 支持协作式多任务处理,并且可以处理异步任务。 |
示例用法 | 辅助函数、实用程序函数。 | 数据管道、异步任务、协作式多任务处理。 |
控制流 | 执行遵循代码的线性路径。 | 执行可以根据 yield point 在协程之间来回跳转。 |
协程的执行
协程是使用 __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("qikepu")
corou.send("Welcome to qikepu")
输出
Searching prefix: Welcome to
Welcome to qikepu
Welcome to qikepu
关闭协程
协程可以无限期运行,因此在不再需要它们时正确关闭它们非常重要。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!!
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 = "qikepu 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!
Searching for ing
welcoming
Done with filtering!!
Done with printing!