热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

协程greenletyieldasyncioasync/await协程意义异步编程事件循环快速上手awaitTask对象

本文介绍了协程的概念和意义,以及使用greenlet、yield、asyncio、async/await等技术实现协程编程的方法。同时还介绍了事件循环的作用和使用方法,以及如何使用await关键字和Task对象来实现异步编程。最后还提供了一些快速上手的示例代码。

文章目录

    • 协程
      • greenlet
      • yield
      • asyncio
      • async / await
    • 协程意义
    • 异步编程
      • 事件循环
      • 快速上手
      • await
      • Task对象


协程

协程(Coroutine)不是计算机提供,程序员人为创造

协程也可以称为微线程, 是一种用户态的上下文切换技术。就是通过一个线程实现代码块相互切换执行。

实现协程方法:

  • greenlet
  • yield
  • asyncio 装饰器
  • async/await 关键字

greenlet

pip install greenlet

from greenlet import greenletdef func1():print(1) # 2. 输出 1gr2.switch() # 3. 切换到 func2 函数print(2) # 6. 输出 2gr2.switch() # 7. 切换到 func2 函数,从上一次执行位置向后执行def func2():print(3) # 4. 输出 3gr1.switch() # 5. 切换到 func1 函数,从上一次执行位置向后执行print(4) # 8. 输出 4gr1 = greenlet(func1)
gr2 = greenlet(func2)gr1.switch() # 1. 执行 func1 函数

yield

def func1():yield 1yield from func2()yield 2def func2():yield 3yield 4for item in func1():print(item)

asyncio


python 3.4 之后支持

import asyncio@asyncio.coroutine
def func1():print(1)yield from asyncio.sleep(2)print(2)@asyncio.coroutine
def func2():print(3)yield from asyncio.sleep(2)print(4)tasks = [asyncio.ensure_future(func1()),asyncio.ensure_future(func2())
]loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

遇到 IO 阻塞自动切换

async / await


python 3.5 之后支持

import asyncioasync def func1():print(1)await asyncio.sleep(2)print(2)async def func2():print(3)await asyncio.sleep(2)print(4)tasks = [asyncio.ensure_future(func1()),asyncio.ensure_future(func2())
]loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))

协程意义

一个线程中遇到 IO 等待时,线程不会傻等,利用空闲时间完成其他任务

异步编程


事件循环

事件循环的作用是管理所有的事件,在整个程序运行过程中不断循环执行,追踪事件发生的顺序将它们放到队列中,当主线程空闲的时候,调用相应的事件处理者来处理事件

快速上手


  • 协程函数:async def 函数名
  • 协程对象:执行 协程函数() 得到协程对象

async def func():pass# 执行协程函数得到协程对象,函数内部代码不会执行
result = func()

# 想要运行协程函数内部代码,必须要将协程对象交给事件循环处理async def func():print('test')res = func()loop = asyncio.get_event_loop()
loop.run_until_complete(res)# py3.7+
asyncio.run(res)

await

await + 可等待的对象 (协程对象, Future, Task对象) IO等待

async def test():print('test')res = await asyncio.sleep(2)

Task对象

Tasks 用于并发调度协程,通过 asyncio.create_task(协程对象) 的方式创建 Task 对象,这样可以让协程加入事件循环中等到被调度执行

# Example 1
async def test():print('test satart...')await asyncio.sleep(2)async def main():print('start...')task1 = asyncio.create_task(test())task2 = asyncio.create_task(test())await task1await task2asyncio.run(main())# start...
# test satart...
# test satart...# sleep 2

# Example 2
async def test():print('test satart...')await asyncio.sleep(1)return '1'async def main():tasks = [asyncio.create_task(test()),asyncio.create_task(test()),]await asyncio.wait(tasks)asyncio.run(main())


推荐阅读
  • 前言无论是对于刚入行工作还是已经工作几年的java开发者来说,面试求职始终是你需要直面的一件事情。首先梳理自己的知识体系,针对性准备,会有事半功倍的效果。我们往往会把重点放在技术上 ... [详细]
  • 深入理解Java多线程并发处理:基础与实践
    本文探讨了Java中的多线程并发处理机制,从基本概念到实际应用,帮助读者全面理解并掌握多线程编程技巧。通过实例解析和理论阐述,确保初学者也能轻松入门。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 开发笔记:图像分割基于阙值+边缘检测+区域法图像分割matlab源码含GUI
    开发笔记:图像分割基于阙值+边缘检测+区域法图像分割matlab源码含GUI ... [详细]
  • Netty基础教程:构建简易Netty客户端与服务器
    Java NIO是解决传统阻塞I/O问题的关键技术之一,但其复杂性给开发者带来了挑战。Netty作为一个成熟的网络编程框架,极大地简化了这一过程。本文将通过一个简单的示例,介绍如何使用Netty创建基本的客户端和服务器。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • Java项目分层架构设计与实践
    本文探讨了Java项目中应用分层的最佳实践,不仅介绍了常见的三层架构(Controller、Service、DAO),还深入分析了各层的职责划分及优化建议。通过合理的分层设计,可以提高代码的可维护性、扩展性和团队协作效率。 ... [详细]
  • 本文深入探讨了面向切面编程(AOP)的概念及其在Spring框架中的应用。通过详细解释AOP的核心术语和实现机制,帮助读者理解如何利用AOP提高代码的可维护性和开发效率。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • 本文深入探讨了 Delphi 中类对象成员的核心概念,包括 System 单元的基础知识、TObject 类的定义及其方法、TClass 的作用以及对象的消息处理机制。文章不仅解释了这些概念的基本原理,还提供了丰富的补充和专业解答,帮助读者全面理解 Delphi 的面向对象编程。 ... [详细]
  • 本文将详细介绍NSRunLoop的工作原理,包括其基本概念、消息类型(事件源)、运行模式、生命周期管理以及嵌套运行等关键知识点,帮助开发者更好地理解和应用这一重要技术。 ... [详细]
  • 本文探讨了在支付项目开发中使用SS5 Socket Server实现内部网络访问外部网络的技术方案。详细介绍了SS5的安装、配置及性能测试过程,旨在为面临相同需求的技术人员提供参考。 ... [详细]
  • Working with Errors in Go 1.13
    作者|陌无崖 ... [详细]
author-avatar
张。、
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有