当前位置: 首页 > 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.sczhlp.com/news/116302/

相关文章:

  • 丹阳市网站制作亚洲tv
  • 网站建设加盟招商创立外包网站
  • 网站开发后台注意事项网页设计模板html代码素材
  • 无锡网站服务公司做网站需要哪些硬件
  • 南京建设银行网站营销方案案例范文1500
  • 如何做营销型单页网站常州做网站基本流程
  • 网站制作公司北京华网陕西省住房和城乡建设厅门户网站
  • 个人网站开发外贸公司管理系统
  • ip网站怎么做外贸订单一般在哪个平台接?
  • 行程长度编码
  • mysql 虚拟列,可以简化 SQL 逻辑、提升查询效率
  • Flash Attention算法动画
  • 合肥企业网站设计制作wordpress html5中文主题
  • 郑州建立网站wordpress虚拟
  • 肇庆建站模板源码网站建设的意见建议
  • 做个网站成本wordpress 附件插件下载失败
  • 国外做贸易网站在哪里可以做海外淘宝网站
  • 宁波网站制作方案wordpress主题 产品展示
  • 微企免费做网站宁夏正丰建设集团公司联网站
  • 网站备案账户名如何查询企业介绍模板范文
  • 河北建设信息网站网站如何静态化
  • PointNetwork-求解TSP-05 - jack
  • 多站点的TSP问题求解-06 - jack
  • Windows 11如何进入安全模式
  • C# CAN通信上位机系统设计与实现
  • 贵阳做网站需要多少钱东莞寮步网
  • 上海平台网站制作公司哪家好课件模板ppt免费
  • 福州营销网站建设老品牌公司注销后网站备案吗
  • 国外那些网站是做菠菜的怎么做网站代码
  • 零售网站制作注册网站怎么注销