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

Rust异步运行时最小实现 - extreme 分享

Rust语言通过定义了Future Trait , 奠定了异步语法的基石,而Rust的异步代码时惰性的,必须有一个运行时来驱动,Rust本身还没提供这样的实现,社区中有不少开源方案,比如tokio等。

Tokio的运行时是一个事件循环,利用了不同平台的异步非阻塞特性,比如kqueue,epoll等。

我一直想要弄清楚runtime是怎么调度Future,而Future完成时又是怎么通知runtime,extreme 实现了一个最小运行时,可以让一窥究竟。

use std::sync::{Arc, Condvar, Mutex};
use std::task::{Context, Poll, RawWaker, RawWakerVTable, Waker};#[derive(Default)]
struct Park(Mutex<bool>, Condvar);fn unpark(park: &Park) {*park.0.lock().unwrap() = true;park.1.notify_one();
}static VTABLE: RawWakerVTable = RawWakerVTable::new(|clone_me| unsafe {let arc = Arc::from_raw(clone_me as *const Park);std::mem::forget(arc.clone());RawWaker::new(Arc::into_raw(arc) as *const (), &VTABLE)},|wake_me| unsafe { unpark(&Arc::from_raw(wake_me as *const Park)) },|wake_by_ref_me| unsafe { unpark(&*(wake_by_ref_me as *const Park)) },|drop_me| unsafe { drop(Arc::from_raw(drop_me as *const Park)) },
);/// Run a `Future`.
pub fn run<F: std::future::Future>(mut f: F) -> F::Output {let mut f = unsafe { std::pin::Pin::new_unchecked(&mut f) };let park = Arc::new(Park::default());let sender = Arc::into_raw(park.clone());let raw_waker = RawWaker::new(sender as *const _, &VTABLE);let waker = unsafe { Waker::from_raw(raw_waker) };let mut cx = Context::from_waker(&waker);loop {match f.as_mut().poll(&mut cx) {Poll::Pending => {let mut runnable = park.0.lock().unwrap();while !*runnable {runnable = park.1.wait(runnable).unwrap();}*runnable = false;}Poll::Ready(val) => return val,}}
}

这个简短的例子表达了实现一个运行时的最低需求

  • 实现RawWakerVTable
  • 如何通过Waker唤醒runtime继续调度,这里用了信号量

本质上运行时可以抽象成一个不断运行的循环体,在循环体内不断调用Future的poll方法。

(当Future返回Poll::Pending时,此处简化为使用信号量的等待操作)

这个例子也说明了Future的调用能返回时,需要调用存储在ctx里面的Waker::waker()方法,唤醒运行时继续执行阻塞的异步任务

http://www.sczhlp.com/news/82133/

相关文章:

  • 黄页88网站推广方案用网站模板给人做网站挣钱吗
  • 常州外贸公司网站建设如何制作微信答题小程序
  • 网站内的新闻怎样做链接营销网站费用
  • 在线教育网站建设投标书网站开发类app
  • 淘宝客代理网站怎么做自己做的网站如何加视频
  • 复健。(11~20,OI)
  • 诗-春江花月夜
  • wordpress建站视频教程团购网站建设公司
  • 中山市做网站专业的WordPress 页码固定
  • 临沂做网站金湖网站设计
  • 大东吴建设新材料公司网站吉林票务通app
  • 桐庐住房和城乡建设局 网站海南网站建设
  • 网站建设要多少钱品牌贵阳网站建设网站制作
  • 滑县住房城乡建设厅门户网站毕业网站建设开题报告
  • 建筑设计资质加盟seo推广工具
  • 网站建设工作小组软件技术专升本
  • 饥荒网站这么做广州哪家公司做网站
  • MIDI简谱播放器1.1程序代码QZQ-2025-8-20
  • 网站制作属于什么科目长沙网业公司
  • 28网站怎么做代理百度seo关键词排名优化
  • 用自己的服务器建网站wordpress显示不同的页脚
  • 个人备案域名可以做企业网站吗酷炫的网站欢迎页面
  • 做网站花钱吗平面设计培训费用
  • 可以直接进入网站的正能量网站建筑工程公司名字大全
  • 【2024-2025第二学期】助教工作学期总结(算法与数据结构)
  • 推销别人做网站有什么作用wordpress那个主题收录好
  • phpcms 恢复网站docker wordpress php
  • 钓鱼网站如何做陕西住房城乡建设部网站
  • 佛山高端网站建设公司wordpress 字段引入
  • 旅游扁平化设计网站模板陕西省建设资质是哪个网站