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

RUST 实现 Future trait

RUST 实现 Future trait

rust 的 Future 可以简单理解成一个状态机,async/await 是实现 Future trait 的语法糖

use std::{sync::{Arc, Mutex}, task::Waker, time::Duration};#[tokio::main]
async fn main() {println!("main start");SleepFut::new(Duration::from_secs(3)).await;println!("main end");
}struct SleepFut {duration: Duration,state: Arc<Mutex<SleepState>>,
}struct SleepState {waker: Option<Waker>,inner_state: SleepInnerState,
}enum SleepInnerState {Init,Sleeping,Done,
}impl SleepFut {fn new(duration: Duration) -> Self {SleepFut {duration,state: Arc::new(Mutex::new(SleepState {waker: None,inner_state: SleepInnerState::Init,})),}}
}impl Future for SleepFut {type Output = ();fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll<Self::Output> {println!("polling...");let mut guard = self.state.lock().unwrap();match guard.inner_state {SleepInnerState::Init => {println!("init");guard.inner_state = SleepInnerState::Sleeping;let duration = self.duration;let state = self.state.clone();std::thread::spawn(move || {println!("thread start");std::thread::sleep(duration);let mut guard = state.lock().unwrap();guard.inner_state = SleepInnerState::Done;if let Some(waker) = guard.waker.take()  {waker.wake();}println!("thread end");});guard.waker = Some(cx.waker().clone());std::task::Poll::Pending}SleepInnerState::Sleeping => {// 只有当新的 waker 与现有 waker 不同时才更新// 这里使用 will_wake 进行优化match &guard.waker {Some(w) if w.will_wake(cx.waker()) => {// 已经是相同的 waker,不需要更新}_ => {// 更新 wakerguard.waker = Some(cx.waker().clone());}}std::task::Poll::Pending},SleepInnerState::Done => {println!("done");std::task::Poll::Ready(())},}}
}
http://www.hskmm.com/?act=detail&tid=9729

相关文章:

  • 行程长度编码
  • mysql 虚拟列,可以简化 SQL 逻辑、提升查询效率
  • Flash Attention算法动画
  • PointNetwork-求解TSP-05 - jack
  • 多站点的TSP问题求解-06 - jack
  • Windows 11如何进入安全模式
  • C# CAN通信上位机系统设计与实现
  • 进程池VS线程池
  • 聊聊昨天CodeBuddy Meetup的一些收获与思考
  • 框架的诞生,本就是人类文明共同涌现的结晶,绝不是某个人的独自觉悟
  • python+Django开发笔记(结合禅道开发测试报告)
  • MVC分层设计模式 2章
  • Questions about learning Symfony
  • 【Python】cx_Freeze模块_打包exe
  • ctfshow web22(子域名爆破)
  • PLC中的运动控制 - (一)轴
  • 墨者学院 某防火墙默认口令
  • IOC控制反转的解耦(相比于直接new对象的正向控制)
  • 墨者学院 浏览器信息伪造
  • AT_arc156_c [ARC156C] Tree and LCS
  • 完整教程:ARM指令集总结
  • 封神台 第二章:遇到阻难!绕过WAF过滤
  • 封神台 第三章:为了更多的权限!留言板!
  • 第一篇
  • C#开发ONVIF客户端与RTSP播放库指南
  • 一行命令查看docker所有网络 + 子网
  • ECT-OS-JiuHuaShan框架元推理,是马克思主义与我思故我在的完美统一,是超越自我
  • vulnhub Beelzebub
  • Salesforce 管理员:是终点,还是跳板?
  • 记一次内务培训