首页 > 其他分享 >有栈协程和无栈协程的区别

有栈协程和无栈协程的区别

时间:2025-01-17 21:21:30浏览次数:1  
标签:调用 协程 嵌套 无栈 有栈 内存

栈空间使用情况
有栈协程

  • 每个协程都有自己的独立栈空间。栈是程序运行时用于存储局部变量、函数调用的返回地址等信息的内存区域。在有栈协程中,当协程切换时,它会保存自己的栈状态,包括栈指针、栈中的局部变量等。
  • 例如,在一个有栈协程中调用了一个深度嵌套的函数,这些函数的局部变量和调用信息都会在协程的栈上保存。当协程暂停和恢复时,这个栈状态会被完整地保存和恢复,就像一个完整的程序上下文一样。
    无栈协程
  • 没有独立的栈空间。它主要依赖于程序的主调用栈。当无栈协程运行时,它会借用当前线程的栈。这意味着无栈协程不能像有栈协程那样进行复杂的嵌套调用,因为它没有自己的栈来保存这些调用信息。
  • 例如,在一个无栈协程中,如果进行深度嵌套的函数调用,可能会导致栈溢出,因为这些调用信息都挤在主调用栈上。

内存占用和开销
有栈协程:

  • 由于每个协程都有自己的栈,所以内存占用相对较大。栈的大小通常是预先分配的,比如每个协程分配1MB的栈空间。
  • 如果创建大量的有栈协程,就会占用大量的内存。而且在协程切换时,需要保存和恢复整个栈状态,这会增加一些额外的开销,包括时间开销和可能的缓存失效等问题。
    无栈协程:
  • 内存占用相对较小。因为它没有独立的栈,所以不需要为每个协程分配额外的栈空间。在协程切换时,由于没有栈状态需要保存和恢复,开销也相对较小。
  • 这使得无栈协程在创建和切换时更加轻量级,适合创建大量的协程。
    编程模型和适用场景
    有栈协程:
    编程模型相对直观,因为它和传统的多线程编程模型比较相似。程序员可以像编写普通函数那样编写协程代码,进行复杂的嵌套调用等操作。
  • 它适用于需要复杂控制流程和大量局部状态的场景,比如在游戏开发中,一个有栈协程可以控制一个角色的行为,包括复杂的决策树和状态机,这些状态都可以在协程的栈上保存。
    无栈协程:
  • 编程模型相对受限,因为它不能进行复杂的嵌套调用。通常需要使用一些特殊的编程技巧,如状态机模式来实现复杂的逻辑。
  • 它适用于一些简单的、事件驱动的场景,比如在异步I/O操作中,一个无栈协程可以等待I/O操作完成,然后进行简单的处理。由于它的轻量级特性,适合在资源受限的环境中大量使用,例如在嵌入式系统中进行并发任务处理。

标签:调用,协程,嵌套,无栈,有栈,内存
From: https://www.cnblogs.com/chhblogs/p/18677679

相关文章

  • 从线程到协程:理解现代编程中的并发革命(一)
    在现代软件开发中,性能与效率始终是工程师追求的目标,而并发编程正是实现这一目标的关键手段。从传统的线程模型到轻量级的协程技术,编程范式正经历一场深刻的变革。线程为我们带来了并发的能力,但伴随而来的是高昂的资源成本和复杂的管理难度。而协程的出现,则为开发者提供了一种更......
  • python协程是否可以解决python多进程队列等待的时间消耗
    相关:强化学习:手动实现一个并行环境采样的代码——SynVectorEnv之前写了一个python环境下的多进程仿真环境采样的代码库,后来突发奇想,想到是否可以使用python的协程来解决python多进程同步通信的等待时间消耗,后来写了个Demo的代码,发现没有啥用,准确来说确实有提高,性能提高的又1......
  • Python语言中进程、线程、协程执行效率分析
    python语言中进程、线程、协程执行效率比较。问题:python语言中进程、线程、协程执行速度哪个最快?在Python中,进程、线程和协程的执行速度不能简单地进行比较,因为它们的性能取决于多种因素,包括任务类型、I/O操作、CPU密集型计算、操作系统调度策略以及Python解释器的实现。进......
  • 进程线程和协程的区别?
    进程的特征独立性:进程是独立的执行单元,拥有自己的内存空间和系统资源并发性:多进程可以同时运行,彼此独立。动态性:进程是程序的一次执行过程,是动态产生和消亡的。资源拥有:进程拥有自己的资源,如内存、文件句柄等。进程的优缺点优点隔离性和稳定性:每个进程拥有独立的地址空间,......
  • delphi 协程 doroutine 协程作用域
    简介一个协程可以支持多个作用域,比如:.scopes([form1,form2,form3]),作用域关闭,则这个作用域下面的所有协程都会被取消并关闭;若一个作用域下,挂载一个协程A,这个协程A又会衍生成百上千的子协程,此时只需要给这个协程A设置一下作用域就可以了,没有必要A衍生的子协程也设置作用域,因......
  • delphi 协程 doroutine 成功回调
    示例代码unitmain;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.ComCtrls,Vcl.StdCtrls,doroutine;typeTForm3=class(TForm)Button1:T......
  • delphi 协程 doroutine bg + ui 嵌套 并行
    前言bg与ui是互相嵌套的,没有终点;就是说程序若是高密计算,ui+bg一切同时并行,快速响应;示例代码unitmain;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dial......
  • delphi 重复执行 协程;doroutine - repeat
    代码示例重复执行的协程是【智能】,是上一次任务【完成后】,间隔x毫秒执行下一次任务;unitmain;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrl......
  • 协程原理 函数栈 有栈协程
    协程为什么开销小于线程协程本质上是线程,将调度的代码在用户态重新实现,因为子程序切换不是线程切换而是由程序自身控制,没有线程切换的开销,所以执行效率高。协程通常是纯软件实现的多任务,与CPU和操作系统通常没有关系,跨平台,跨体系结构。协程在执行过程中可以调用别的协程,自己则......
  • 21. C++快速入门--协程 Coroutine 入门
    参考:https://www.cnblogs.com/blizzard8204/p/17563217.htmlhttps://www.bennyhuo.com/2022/03/09/cpp-coroutines-01-intro/本文不完整,更新中1基本概念什么是协程?C++20的协程是一个特殊函数,具有挂起和恢复的能力.(可以不一次性执行)协程可用于异步编程,提供......