likes
comments
collection
share

简单聊一下 Python 协程

作者站长头像
站长
· 阅读数 8

你好,我是 shengjk1,多年大厂经验,努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注!你会有如下收益:

  1. 了解大厂经验
  2. 拥有和大厂相匹配的技术等

希望看什么,评论或者私信告诉我!

一、前言

最近见了很多类似于这样的代码:

  1. 通过 async def 来定义函数
  2. 函数体部分可能会有也可能没有 await 关键字 比如:
async def log_requests(request: Request, call_next):
    # log the request
    print(f"Received request: {request.method} {request.url}")
    # call the next middleware or request handler
    response = await call_next(request)
    # log the response
    print(f"Sent response: {response.status_code}")
    return response

经过多方查询资料,发现这是协程常见的创建方式,所以我们现在是时候聊一聊 Python 的协程了

二、协程

2.1 协程是什么

协程在一个线程内执行,不需要创建额外的线程或进程,是一种轻量级的并发编程模型,它允许在程序执行过程中暂停和恢复执行,从而实现异步和并发操作。

进程
线程
协程

协程是运行在线程里面的,一个线程可以运行多个协程。线程是运行在进程里面的,一个进程可以运行多个线程

2.2 为什么需要协程

最初的目的是为了满足 互联网和连接的增长引发了对响应式和可扩展代码的需求,另外也使 Python 在处理异步编程时,更加简单和高效。

同时也可以解决Python在处理异步编程时的一些问题,比如:传统的多线程编程模型在处理大量并发任务时存在一些困难和限制,包括线程切换开销、共享数据的同步与互斥等问题。协程提供了一种更轻量级、更高效的方式来处理并发任务。

2.3 创建协程

通过 async/await 语法来声明 协程 是编写 asyncio 应用的推荐方式。比如

async def log_requests(request: Request, call_next):
    response = await call_next(request)
    return respons

2.4 协程优势

协程在异步编程中的主要优势包括:

  1. 轻量级和高效性:协程在一个线程内执行,避免了线程切换的开销,因此具有较小的资源消耗和高效的执行速度。
  2. 简化并发编程:协程提供了一种更直观、顺序化的编程模型,使得编写并发代码更加简单和易于理解。它们避免了传统并发编程中的锁、条件变量等复杂的同步机制。。
  3. ** 可读性和维护性**:协程使用特殊的语法和关键字,使得编写并发代码更加直观和易于理解。协程可以将复杂的并发逻辑以顺序化的方式组织起来,提高代码的可读性和维护性。
  4. 避免竞态条件:由于协程在一个线程内执行,不存在多线程并发访问共享数据的竞态条件问题。协程可以通过暂停和恢复执行来避免并发访问共享数据时的同步问题。
  5. 统一的编程模型asyncio提供了一个统一的异步编程框架,可以处理多种类型的异步任务,如网络通信、文件操作、并发任务等。这使得开发者可以使用相同的编程模型来处理不同的异步场景,提高了代码的复用性和可扩展性。

2.5 使用场景

首先我们应该明确 Python 协程并没有解决 全局解释器锁 带来的问题。因此协程无法充分利用多核处理器的优势,但在I/O密集型任务的场景下,协程的性能通常优于使用线程,因为协程能够更高效地利用等待I/O的时间。

三、总结

本文详细介绍了Python中的协程概念及其在异步编程中的应用。协程是一种轻量级的并发编程模型,通过在一个线程内执行,避免了线程切换的开销,具有较小的资源消耗和高效的执行速度。协程提供了一种直观、顺序化的编程模型,简化了并发编程,并提高了代码的可读性和维护性。协程在处理I/O密集型任务时表现出色,并且通过暂停和恢复执行避免了竞态条件的问题。Python的asyncio模块提供了对协程的支持,并提供了一个统一的异步编程框架。协程在现代异步编程中具有重要的作用。