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

栈空间使用情况
有栈协程

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

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

  • 由于每个协程都有自己的栈,所以内存占用相对较大。栈的大小通常是预先分配的,比如每个协程分配1MB的栈空间。
  • 如果创建大量的有栈协程,就会占用大量的内存。而且在协程切换时,需要保存和恢复整个栈状态,这会增加一些额外的开销,包括时间开销和可能的缓存失效等问题。
    无栈协程:
  • 内存占用相对较小。因为它没有独立的栈,所以不需要为每个协程分配额外的栈空间。在协程切换时,由于没有栈状态需要保存和恢复,开销也相对较小。
  • 这使得无栈协程在创建和切换时更加轻量级,适合创建大量的协程。
    编程模型和适用场景
    有栈协程:
    编程模型相对直观,因为它和传统的多线程编程模型比较相似。程序员可以像编写普通函数那样编写协程代码,进行复杂的嵌套调用等操作。
  • 它适用于需要复杂控制流程和大量局部状态的场景,比如在游戏开发中,一个有栈协程可以控制一个角色的行为,包括复杂的决策树和状态机,这些状态都可以在协程的栈上保存。
    无栈协程:
  • 编程模型相对受限,因为它不能进行复杂的嵌套调用。通常需要使用一些特殊的编程技巧,如状态机模式来实现复杂的逻辑。
  • 它适用于一些简单的、事件驱动的场景,比如在异步I/O操作中,一个无栈协程可以等待I/O操作完成,然后进行简单的处理。由于它的轻量级特性,适合在资源受限的环境中大量使用,例如在嵌入式系统中进行并发任务处理。
posted @   陈浩辉  阅读(121)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
ヾ(≧O≦)〃嗷~
点击右上角即可分享
微信分享提示