[推荐] 最近学写 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

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

poj1330(LCA最近公共祖先)

题意:求最近公共祖先 思路:之前学习了树链剖分,然后我就用树链剖分的一小部分知识就可以解这个题目了,记录每个结点的fa和depth。然后查找时,每次将depth大的结点往上走直到x = y。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstring>

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

智能交通(二)——Spinger特刊推荐

特刊征稿 01  期刊名称: Autonomous Intelligent Systems  特刊名称: Understanding the Policy Shift  with the Digital Twins in Smart  Transportation and Mobility 截止时间: 开放提交:2024年1月20日 提交截止日

【Rust练习】12.枚举

练习题来自:https://practice-zh.course.rs/compound-types/enum.html 1 // 修复错误enum Number {Zero,One,Two,}enum Number1 {Zero = 0,One,Two,}// C语言风格的枚举定义enum Number2 {Zero = 0.0,One = 1.0,Two = 2.0,}fn m

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

开放式耳机好用?平价开放式耳机推荐?四款开放式的蓝牙耳机推荐

开放式耳机好用吗?有平价些的开放式耳机推荐吗?那这两个问题的回答当然是肯定的。 首先开放式耳机好不好用取决于对耳机的需求,因为开放式耳机其实是比较适用于需要注意周围环境、需要‌长时间佩戴舒适以及需要频繁与人交流的场景中,在这些场景下使用开放式耳机的话就会比较有优势。就例如跑步骑行健身等运动的时候,能够兼得佩戴舒适度的同时,增加一定的安全性;还有在办公学习的时候,会很适合长时间佩戴,能够方便和

第二十四章 rust中的运算符重载

注意 本系列文章已升级、转移至我的自建站点中,本章原文为:rust中的运算符重载 目录 注意一、前言二、基本使用三、常用运算符四、通用约束 一、前言 C/C++中有运算符重载这一概念,它的目的是让即使含不相干的内容也能通过我们自定义的方法进行运算符操作运算。 比如字符串本身是不能相加的,但由于C++中的String重载了运算符+,所以我们就可以将两个字符串进行相加、但实际

最近心情有点复杂:论心态

一月一次的彷徨又占据了整个身心;彷徨源至不自信;而不自信则是感觉自己的价值没有很好的实现亦或者说是自己不认可自己的目前的生活和状态吧。 我始终相信一句话:任何人的生活形态完全是由自己决定的;外在的总归不能直达一个人的内心深处。所以少年 为了自己想要的生活 多坚持努力吧、不为别人只为自己心中的那一丝执着。 由此我看到了一个故事: 一个心情烦躁的人去拜访禅师。他问禅师:我这辈子就这么注定了吗?您