《Python参考手册(第4版•修订版)》——1.13 协程

简介:

本节书摘来自异步社区《Python参考手册(第4版•修订版)》一书中的第1章,第1.13节,作者David M. Beazley,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.13 协程

通常,函数运行时要使用单一的一组输入参数。但是,函数也可以编写成一个任务程序, 用来处理发送给它的一系列输入。这类函数被称为协程,它是通过将yield语句作为表达式(yield)的形式创建的,如下所示:

def print_matches(matchtext): 
    print "Looking for",matchtext
    while True:
         line = (yield)    # 获得一行文本
         if matchtext in  line:
             print line

要使用这个函数,首先要调用它,向前执行到第一条(yield)语句,然后使用send()给它发送数据,例如:

>>> matcher = print_matches("python")
>>> matcher.next()     # 向前执行到第一条(yield)语句
Looking for python
>>> matcher.send("Hello World")
>>> matcher.send("python is cool")
python is cool
>>> matcher.send("yow!")
>>> matcher.close()    # matcher函数调用结束
>>>

使用send()为协程发送某个值之前,协程会暂时中止。发送值之后,协程中的(yield)表达式将返回这个值,而接下来的语句将会处理它。处理直到遇到下一个(yield)表达式才会结束,这时函数将暂时中止。正如上一个例子所示,这个过程将会继续下去,直到协程函数返回或者调用它的close()方法为止。

基于生产者—消费者模型(即程序的一部分生成的数据会被程序的另一部分使用)编写并发程序时,协程十分有用。在这种模型中,协程代表了数据的一个消费者。下面给出了一起使用生成器和协程的一个例子:

# 一组匹配器协程 
matchers = [
    print_matches("python"),
    print_matches("guido"),
    print_matches("jython")
]
# 通过调用next()准备所有的匹配器
for m in matchers: m.next()

# 将一个活跃的日志文件传递给所有的匹配器。注意,为保证运行正常,
    # 必须有一台Web服务器持续将数据写入日志
wwwlog = tail(open("access-log"))
for line in wwwlog:
    for m in matchers:
        m.send(line)        # 将数据发送到每个匹配器协程中

第6章将会进一步介绍协程。

相关文章
|
26天前
|
网络协议 调度 开发者
python中gevent基于协程的并发编程模型详细介绍
`gevent`是Python的第三方库,提供基于协程的并发模型,适用于I/O密集型任务的高效异步编程。其核心是协程调度器,在单线程中轮流执行多个协程,通过非阻塞I/O实现高并发。主要特点包括协程调度、事件循环的I/O模型、同步/异步编程支持及易用性。示例代码展示了一个使用`gevent`实现的异步TCP服务器,当客户端连接时,服务器以协程方式处理请求,实现非阻塞通信。
14 0
|
2月前
|
并行计算 调度 开发者
深入浅出Python协程:提升你的异步编程效率
在当今快速发展的软件开发领域,异步编程已成为提高程序性能和用户体验的关键技术。Python,作为一门广泛使用的高级编程语言,其协程(Coroutine)功能为开发者提供了强大的异步编程工具。本文将从协程的基本概念入手,通过实例深入浅出地讲解如何在Python中有效利用协程来提升异步编程的效率和可读性。我们将探讨协程的工作原理、与传统多线程/多进程相比的优势,以及如何在实际项目中应用协程来解决复杂的并发问题。通过本文的学习,读者将能够掌握Python协程的核心知识,为构建高效、可维护的异步应用奠定坚实基础。
|
12天前
|
调度 数据库 Python
探索Python中的异步编程:从回调到协程
本文将探讨Python中异步编程的演变过程,从最初的回调函数到现代的协程机制。我们将深入了解异步编程的原理、优势以及如何使用Python的asyncio库来实现高效的异步程序。通过本文,读者将了解到异步编程的基本概念、常见的应用场景,以及如何利用Python的强大功能来提升程序的性能和可维护性。
|
16天前
|
Python
探索Python中的异步编程:从回调到协程
传统的Python编程模式中,使用回调函数处理异步任务是常见的做法。然而,随着Python 3.5引入的asyncio模块,异步编程有了更加优雅和高效的解决方案:协程。本文将深入探讨Python中异步编程的发展历程,从回调函数到协程的演变,并介绍如何使用asyncio模块来实现异步任务,提高程序的性能和响应速度。
|
18天前
|
调度 Python
Python多线程、多进程与协程面试题解析
【4月更文挑战第14天】Python并发编程涉及多线程、多进程和协程。面试中,对这些概念的理解和应用是评估候选人的重要标准。本文介绍了它们的基础知识、常见问题和应对策略。多线程在同一进程中并发执行,多进程通过进程间通信实现并发,协程则使用`asyncio`进行轻量级线程控制。面试常遇到的问题包括并发并行混淆、GIL影响多线程性能、进程间通信不当和协程异步IO理解不清。要掌握并发模型,需明确其适用场景,理解GIL、进程间通信和协程调度机制。
30 0
|
26天前
|
存储 Python
python使用gevent库来创建协程,并通过协程实现并发执行不同的任务
```markdown 这段Python代码利用`gevent`库实现并发执行协程。定义了两个打印函数`f1`和`f2`,分别输出"csdn"和"yyds"。代码首先创建列表`t_l`,并启动5个`f1`协程,将其加入列表并等待所有协程完成。随后,同样方式启动5个`f2`协程,存入`t1_l`列表并等待执行完毕。整体展示了`gevent`的协程并发操作。 ```
11 1
|
2月前
|
程序员 Python
探索Python中的异步编程:从回调地狱到协程魔法
本文探讨了Python中的异步编程,从传统的回调地狱到现代的协程技术。通过对回调函数、多线程、多进程和协程的对比分析,展示了协程在提高代码性能和可维护性方面的优势,并介绍了如何使用asyncio库实现异步编程的实践方法。
|
2月前
|
API 数据处理 调度
Python中的异步编程与协程应用
传统的Python编程在处理IO密集型任务时常常面临效率低下的问题,而异步编程和协程技术的引入为解决这一问题提供了有效的途径。本文将介绍Python中异步编程的基本概念,深入探讨asyncio库的使用以及协程在实际项目中的应用,旨在帮助开发者更好地理解和运用异步编程技术。
|
2月前
|
调度 Python
python协程—asyncio模块
python协程—asyncio模块
24 0
|
2月前
|
API 开发者 Python
深入浅出Python协程:提升并发编程效率
在当今高速发展的互联网时代,高并发成为了软件开发中的一个重要需求。本文将引领读者深入理解Python中的协程(Coroutine)概念,探讨其在并发编程中的应用及优势。我们将从协程的基础概念出发,通过实例讲解如何使用asyncio库来编写高效的异步代码。文章旨在帮助读者掌握协程的工作原理和使用方法,从而在实际开发中能够更好地利用Python进行高效的并发编程。