当前位置: 首页 > news >正文

关于 Rust 异步(无栈协程)的相关疑问

这是一个记录问题+求助的文章。

关于 waker 与运行时的合作方式

我肤浅地学习了 Rust 异步底层实现原理,关于 Future、waker 和运行时等。关于 waker 我有三点猜测:

  1. waker 是由实现执行器的人提供的
  2. 在执行器中会调用 epoll_wait,epoll 返回 fd,执行器找到对应的 waker,调用 wake() 通知任务继续
  3. 最底层的 future 是人工实现的,而不是编译器生成的,future 内部调用 cx.waker() 获取 waker,在任务无法继续执行时,把 waker 注册到特定运行时的注册表中,与 fd 关联。调用 epoll_ctl 注册 fd。

我想知道既然 Future 要把 waker 注册给运行时,使得运行时知道这个 waker 是与某个 fd 关联的。那么实现这个 Future 的 poll 方法时,就应该知道这个 Future 将来会被哪个运行时调用,从而知道怎么给这个运行时注册 waker。但真的是这样吗,这样岂不就决定了这个 Future 不能被其他运行时调用了?或者说 Rust 生态中,你要实现一个异步库,就必须得选定一个运行时,干脆用运行时提供的底层 Future,自己只是实现一些上层的应用逻辑?

关于无栈协程的传染性

这种说法的来源是哪里?网上有人说无栈协程以“函数返回”的方式完成从协程到主协程(或者说正常线程执行流)的切换,所以协程执行过程中创造的栈没有被保存,最终导致传染性。而传染性是指调用 await 的地方,必须在 async,而 async 又必须以 await 的形式调用,这样传入到最外层也都是 async/await 了。

但是“必须在 async 里调用 await”不只是一个编译器规定吗,如果编译器没这么规定就没有传染性了?一定有人说,编译器之所以这么规定是因为“无栈”的设计,这么规定是必然的。但 async 函数实际上是 impl Future 类型,对 Future 的 poll 是没有传染性的(可以在一般的非 async 函数中 poll),而 Future poll 的过程也会在不同的地方中断,其局部变量等上下文不也保存的好好的?无栈只是指局部变量不以栈的形式保存,也不以切换上下文的形式切换。

我没用过太多 Rust 异步特性,用的也都是在很高层次上使用。我觉得为了理解上述问题可能需要阅读一些异步库,甚至自己写一个小的 tokio。(阅读 tokio 的源码是不是太难了,有没有 mini-tokio 啊)

BTW,我是不是不应该指望 csdn 的环境能有人回答我的问题呀hh,希望有大佬能参与讨论

http://www.lryc.cn/news/614760.html

相关文章:

  • 书生浦语第五期-L1G3-LMDeploy 课程
  • AI入门学习--如何对RAG测试
  • 讲一讲@ImportResource
  • 触觉导航新突破:Contactile 触觉传感器推动机器人 “零示教” 实现复杂曲面作业
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘transformers’问题
  • 线程同步相关知识
  • 构建高可用架构:ZDNS GSLB 在多数据中心场景下的应用与 F5 替换实践
  • Linux网络--1、网络基础
  • Java零散知识点
  • Claude Code:智能代码审查工具实战案例分享
  • 阶段二测试
  • 华为网路设备学习-28(BGP协议 三)路由策略
  • Latex中公式部分输入正体的字母\mathrm{c}
  • v-model双向绑定指令
  • 【工作笔记】Docker Desktop一直转圈加载不出来然后报错
  • 数据结构---二叉树(概念、特点、分类、特性、读取顺序、例题)、gdb调试指令、时间复杂度(概念、大O符号法、分类)
  • CSS:BFC
  • 深入解析Linux信号处理机制
  • DeepSeek辅助编写的带缓存检查的数据库查询缓存系统
  • 三方相机问题分析七:【datespace导致GPU异常】三方黑块和花图问题
  • Sum of Three Values(sorting and searching)
  • 基于MATLAB实现的毫米波大规模MIMO系统中继混合预编码设计
  • Python Day26 HTTP 协议相关笔记
  • Neo4j APOC插件安装教程
  • 论文阅读:AAAI 2024 ExpeL: LLM Agents Are Experiential Learners
  • 连锁店管理系统的库存跟踪功能:数字化转型下的零售运营核心
  • Nextcloud容器化部署新范式:Docker与Cpolar如何重塑私有云远程访问能力
  • 浅试A2A
  • 商品 SKU 计算,库存不足不能选择
  • SpringBoot的profile加载