[推荐] 最近学写 async/await 被 Rust 毒打的经验

2024-06-23 00:48

本文主要是介绍[推荐] 最近学写 async/await 被 Rust 毒打的经验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不要自作主张地返回 Poll::Pending。

只有在你调用的方法返回了 Poll::Pending 时,才能够返回 Poll::Pending。 不然,也许程序会通过编译,但运行结果不会是你想要的。如果你的 Future 只是对现有 Future 的简单包装,一般不会犯这种错误,但情况复杂了,可能会忘。

我们日常使用的 Future,如 TcpStream/channel/timer 之类,其实是与底层的 reactor 相关联的,它们在返回 Poll::Pending 的时候,同时会在 reactor 注册事件,所以才会收到通知,最终 wakeup 相应的 Future。我们自己随便返回 Poll::Pending 的时候,显然不会收到通知的。

可能是由于 Rust 选择的抽象方式的原因,我们一般只关注 Future 本身,忽略与 reactor 的联系。其他语言的话,貌似 reactor 或者叫 event loop 才是最核心的概念。

async/await 是高层 primitive,而 Poll 是低层 primitive。高层使用低层,很方便,反过来,比较麻烦,得避免。

有个感觉,async/await 普及开来的话,Poll 只有较底层的库才关心,日常只会与 async/await 打交道。 (另外,我们就算与 Poll 打交道时,其实几乎也不关心 Context 或者 Waker,感觉它们更底层。)

await 与 tokio::sync::Mutex 一起使用,需要注意死锁问题。

从某种意义上说 await 也是有「锁」的语义,至少都需要「等待」。只是 Mutex 等待别人 unlock,而 await 在等待事件发生。(tokio::sync::Mutext 的 lock() 方法返回的就是 Future,需要你 await 的。)

举个例子,lock 之后,然后 await。如果被 await 的 Future,也需要 lock,然后才能返回 Poll::Ready。这时实际上就死锁了,两个 Future 会无限等待下去。

所以呢,不要认为,我反正只用了一把锁,所以死锁是不可能的。(推

这篇关于[推荐] 最近学写 async/await 被 Rust 毒打的经验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1085863

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言

OpenManus本地部署实战亲测有效完全免费(最新推荐)

《OpenManus本地部署实战亲测有效完全免费(最新推荐)》文章介绍了如何在本地部署OpenManus大语言模型,包括环境搭建、LLM编程接口配置和测试步骤,本文给大家讲解的非常详细,感兴趣的朋友一... 目录1.概况2.环境搭建2.1安装miniconda或者anaconda2.2 LLM编程接口配置2

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Rust中的注释使用解读

《Rust中的注释使用解读》本文介绍了Rust中的行注释、块注释和文档注释的使用方法,通过示例展示了如何在实际代码中应用这些注释,以提高代码的可读性和可维护性... 目录Rust 中的注释使用指南1. 行注释示例:行注释2. 块注释示例:块注释3. 文档注释示例:文档注释4. 综合示例总结Rust 中的注释

Rust格式化输出方式总结

《Rust格式化输出方式总结》Rust提供了强大的格式化输出功能,通过std::fmt模块和相关的宏来实现,主要的输出宏包括println!和format!,它们支持多种格式化占位符,如{}、{:?}... 目录Rust格式化输出方式基本的格式化输出格式化占位符Format 特性总结Rust格式化输出方式

前端 CSS 动态设置样式::class、:style 等技巧(推荐)

《前端CSS动态设置样式::class、:style等技巧(推荐)》:本文主要介绍了Vue.js中动态绑定类名和内联样式的两种方法:对象语法和数组语法,通过对象语法,可以根据条件动态切换类名或样式;通过数组语法,可以同时绑定多个类名或样式,此外,还可以结合计算属性来生成复杂的类名或样式对象,详细内容请阅读本文,希望能对你有所帮助...

Rust中的Drop特性之解读自动化资源清理的魔法

《Rust中的Drop特性之解读自动化资源清理的魔法》Rust通过Drop特性实现了自动清理机制,确保资源在对象超出作用域时自动释放,避免了手动管理资源时可能出现的内存泄漏或双重释放问题,智能指针如B... 目录自动清理机制:Rust 的析构函数提前释放资源:std::mem::drop android的妙