首页 > 其他分享 >协程的分类与真假协程的区别

协程的分类与真假协程的区别

时间:2023-12-29 09:56:53浏览次数:22  
标签:协程 无栈 分类 生成器 Coroutines 真假 伪协程 真协程

协程可以按执行类型分为三大类:生成器协程(Generator Coroutines)、无栈协程(Stackless Coroutines)和有栈协程(Stackful Coroutines)。

1. 生成器协程(Generator Coroutines):
生成器协程是一种在函数执行期间可以暂停和恢复的特殊函数。它使用生成器函数和 yield 关键字来实现。生成器协程的执行状态是通过迭代器对象和函数内部的状态变量来管理的。

2. 无栈协程(Stackless Coroutines):
无栈协程是一种不依赖调用栈的协程实现方式。它使用其他数据结构来管理协程的执行状态,而不是使用调用栈。无栈协程通常需要使用更高级的语言特性或工具来实现,如异步生成器、Promise、async/await、Kotlin等。

3. 有栈协程(Stackful Coroutines):
有栈协程是一种更传统的协程模型,它在执行期间会使用调用栈来保存函数的执行状态。有栈协程通常需要底层的语言支持或特定的运行时环境来实现,如 C、C++、Java 虚拟线程等。

这三种协程模型在实现方式和特性上有所不同,适用于不同的应用场景和需求。生成器协程在 JavaScript 中是一种常见的实现方式,而无栈协程和有栈协程通常需要更高级的语言特性或工具的支持。

在编程领域,"真协程"和"伪协程"是两种不同的概念,用来描述协程的实现方式和特性。
"真协程"(也称为对称协程或无栈协程)是一种协程实现方式,它使用共享栈空间来保存协程的上下文,并在协程切换时进行恢复。真协程不需要为每个协程分配独立的栈空间,因此具有较低的内存消耗。真协程的特点是可以在协程之间进行对称的挂起和恢复,而不需要特定的调用者-被调用者关系。协程之间的切换可以在任意两个协程之间发生,而不仅仅是在调用栈的顶部。相比之下,"伪协程"(也称为半协程或有栈协程)是一种协程实现方式,它为每个协程分配独立的栈空间。伪协程的切换通常需要通过特定的调用者-被调用者关系来实现,并且只能在调用栈的顶部进行。伪协程的特点是每个协程都有自己的栈空间,可以独立地保存和恢复执行上下文。协程之间的切换通常需要显式地调用特定的切换函数或语句。需要注意的是,"真协程"和"伪协程"这两个术语并没有严格的定义,有时也会根据不同的上下文和语言来使用。在某些情况下,"真协程"可能指代无栈协程,而"伪协程"可能指代有栈协程。因此,具体的含义可能会因语境而异。总结起来,"真协程"是指使用共享栈空间实现的协程,具有较低的内存消耗,并且可以在任意两个协程之间进行对称的挂起和恢复。而"伪协程"是指为每个协程分配独立的栈空间实现的协程,通常需要显式地调用切换函数或语句来进行协程的切换。希望这个回答对你有帮助!如果你还有其他关于协程或其他主题的问题,请随时提问。我将尽力提供准确和有用的答案。需要注意的是,协程的分类并不是严格的,有时候也会存在一些模糊的边界和重叠。不同的编程语言和工具可能会有不同的协程实现方式和命名约定。

版权声明:本文原来写于CSDN博主「KloseYu 11也就是我的CSDN」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

http://t.csdnimg.cn/4XuRH

标签:协程,无栈,分类,生成器,Coroutines,真假,伪协程,真协程
From: https://www.cnblogs.com/KloseYu/p/17872120.html

相关文章

  • Kotlin 协程源码阅读笔记 —— Mutex
    Kotlin协程源码阅读笔记——Mutex我们在Java/Kotlin编程时如果需要某段代码块同一时间只有一个线程能够执行时,通常是使用synchronized,但是协程中可不能使用synchronized,为什么呢?如果你了解过协程的工作方式就不会觉得奇怪(如果不了解协程工作方式的同学,可以看以下代码为......
  • OpenCV的人形识别级联分类器使用方法
    OpenCV的人形识别级联分类器使用方法如下:首先,确保已经安装了OpenCV库。如果没有安装,可以使用以下命令进行安装:pipinstallopencv-python下载一个预训练的人形识别级联分类器文件,例如haarcascade_fullbody.xml。这个文件可以在OpenCV的GitHub仓库中找到:https://github.com/......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    文章目录Flink系列文章一、maven依赖二、示例:基于数量的滚动窗口与滑动窗口1、滚动窗口实现地铁进站口人数1)、实现2)、验证步骤2、滑动窗口实现地铁进站口人数1)、实现2)、验证步骤三、示例:会话窗口1、实现2、验证步骤本文介绍了Flinkwindow基于数量的滚动、滑动窗口和会话窗口示......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    文章目录Flink系列文章一、Flink的window介绍1、window介绍2、windowAPI1)、WindowAssigner2)、Trigger3)、Evictor3、window的生命周期二、window的分类1、TumblingWindows2、SlidingWindows3、SessionWindows4、GlobalWindows5、按照时间time和数量count分类6、按照滑动间隔s......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    文章目录Flink系列文章一、maven依赖二、示例:基于时间的滚动和滑动窗口1、滚动窗口实现统计地铁进站口人数1)、一般实现(Tuple2数据结构)及验证2)、面向对象实现(pojo数据结构)及验证3)、面向对象lambda实现(pojo的数据结构lambda)及验证4)、一般lambda实现(Tuple2数据结构)及验证2、滑动窗口......
  • 【flink番外篇】5、flink的window(介绍、分类、函数及Tumbling、Sliding、session窗口
    文章目录Flink系列文章一、Flink的window介绍1、window介绍2、windowAPI1)、WindowAssigner2)、Trigger3)、Evictor3、window的生命周期二、window的分类1、TumblingWindows2、SlidingWindows3、SessionWindows4、GlobalWindows5、按照时间time和数量count分类6、按照滑动间隔s......
  • 前端发送请求的时候 Content-Type 内容分类, django后端分别怎么接收
    前端发送请求时,常见的Content-Type内容类型包括:application/x-www-form-urlencoded这是最常见的内容类型,用于发送键值对形式的数据。数据被编码为URL查询字符串格式。Django后端可以通过request.POST来接收这些参数。multipart/form-data通常用于文件上传的表......
  • 你不知道的CoroutineContext:协程上下文大揭秘!
    前言协程(Coroutine)是一种并发编程技术,它允许我们在一个线程中执行多个任务,而不需要创建多个线程。协程与线程的区别在于,线程是操作系统的概念,而协程是编程语言的概念。协程可以暂停和恢复执行,而线程只能被终止。在Android中,协程由Kotlin语言支持。Kotlin协程库提供了丰富的AP......
  • 人工智能大模型原理与应用实战:文本分类与情感分析
    1.背景介绍人工智能(ArtificialIntelligence,AI)是一门研究如何让计算机模拟人类智能的科学。在过去的几年里,人工智能技术的发展取得了显著的进展,尤其是在深度学习(DeepLearning)和自然语言处理(NaturalLanguageProcessing,NLP)方面。这篇文章将介绍一种名为“文本分类与情感分析”......
  • Go简单自定义协程池
    packagemainimport( "fmt" "sync")typeTaskstruct{ ffunc()error}varwgsync.WaitGrouptypePoolstruct{ //任务通道 JobQueuechanTask //worker通道 WorkerQueuechanchanTask //worker数量 MaxWorkersint}funcNewPool(ma......