简单聊一下 Python 协程

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

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

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

一、前言

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

python 复制代码
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 协程是什么

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

graph TD 进程 --> 线程 --> 协程

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

2.2 为什么需要协程

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

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

2.3 创建协程

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

python 复制代码
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模块提供了对协程的支持,并提供了一个统一的异步编程框架。协程在现代异步编程中具有重要的作用。

相关推荐
从入门到入土Q几秒前
Ollama:本地大语言模型(LLM)部署 && 使用 Ollama 构建一个智能问答系统
人工智能·语言模型·自然语言处理
Sun_Sherry9 分钟前
NLP:命名实体识别及案例(Bert微调)
人工智能·自然语言处理·bert
CN.LG15 分钟前
浅谈Python之协程
开发语言·python
黄俊懿36 分钟前
【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
java·分布式·后端·spring cloud·微服务·架构·手写源码
斯凯利.瑞恩38 分钟前
2023国赛C题 蔬菜类商品的自动定价与补货决策(上)
python·数学建模·国赛真题解析
kolaseen42 分钟前
神经网络构建原理(以MINIST为例)
人工智能·深度学习·神经网络·机器学习
JH_vision1 小时前
生成式AI:ChatGPT及其在各行业的应用前景
人工智能·chatgpt
AI王也1 小时前
ChatGPT 在国内使用的方法
人工智能·chatgpt·prompt·aigc
AiBoxss1 小时前
提升效率的AI工具集 - 轻松实现自动化
运维·人工智能·自动化
学技术的大胜嗷1 小时前
pycharm连接远程linux服务器上的docker进行深度学习训练
linux·服务器·pytorch·python·深度学习·神经网络·pycharm