当前位置:首页 > 报告详情

郭子兴-RustChineConf2023.pdf

上传人: 2*** 编号:132035 2023-06-30 19页 7.77MB

1、第三届中国Rust开发者会Rust 是否需要另种“彩”的 Future?郭兴,字节跳动服务框架团队研发程师。作者Rust 是否需要另种“彩”的 Future?标题Rust 编译器将 async 块翻译成由标准库提供的 Future 类型,户可以便地通过定义 Future 以实现阻塞的 IO 或并发控制语义。异步执器被允许在任意时刻删除成的 Future 实例以取消正在执的异步操作,但取消总是副作的吗?Rust 是否需要另种“颜”的 Future 为有副作取消的异步为提供安全保证?回顾如何使 Future 持基于 poll 的 IO,以及基于取消 Future 的流程控制#基于 Poll 的 F

2、utureio-uring 等异步模型让 Future 的取消不再副作,这可能导致严重的错误#不再是副作的取消#最终与折中案引另种“颜”的 Future 以最终解决问题,或者基于字节跳动开源的异步驱动器 monoio 探索的折中案录Rust 中的异步Rust 基于 Future trait 实现异步编程pub trait Future type Output;fn poll(self:Pin,cx:&mut Context)?Poll;pub trait Future type Output;fn poll(self:Pin,cx:&mut Context)?Poll;pub struct T

3、cpReadFuture io:TcpStream,buf:&buf mut u8,impl Future for TcpReadFuture type Output=io?Result;fn poll(self:Pin,_cx:&mut Context)?Poll let this=self.get_mut();match this.io.read(this.buf)Ok(n)?Poll?Ready(Ok(n),Err(ref e)if e.kind()?std?io?ErrorKind?WouldBlock?register poll event here Poll?Pending Err

4、(e)?Poll?Ready(Err(e),Future 中的 IO基于 poll 的 IO 事件被表达为在内核通知消息准备好时,次性地同步获取。struct PollOnce inner:F,impl Future for PollOnce where F:Future+Unpin,type Output=Option;fn poll(self:Pin,cx:&mut Context)?Poll let this=self.get_mut();match Pin?new(&mut this.inner).poll(cx)Poll?Ready(ready)?Poll?Ready(Some(re

5、ady),Poll?Pending?Poll?Ready(None),取消 Future户可以突破 async/await 封装的 Future 类型,被构造的 Future 类型不要求返回完成即可被析构。async fn task_one()/?/async fn task_two()/?/async fn race_tasks()let t1=task_one();let t2=task_two();pin!(t1,t2);select!()=t1?println!(task one completed first),()=t2?println!(task two completed fi

6、rst),Select:基于取消的并发控制语义select!是常的并发控制语义,它的语义当其中个分完成时即返回,不必等待所有 Future 实例完成。async fn listen(listener:TcpListener)loop let t1=listner.accept();let t2=timeout_2s();pin!(t1,t2);select!stream=t1?handle(stream).await,()=t2?println!(time out),取消不再是副作的取消基于完成的 IO 事件不再是副作的,基于副作取消的控制流程可能会引发致命错误。1.获取连结;2.进接收循环;

word格式文档无特别注明外均可编辑修改,预览文件经过压缩,下载原文更清晰!
三个皮匠报告文库所有资源均是客户上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作商用。
本文探讨了Rust编程语言中异步编程的未来方向。文章指出,现有的异步编程模型中,Future的取消机制存在问题,可能导致未定义行为。作者提出了一种新的异步编程模型,即CompletionFuture,它可以在未返回Poll::Ready前安全地析构,并且可以正确地传递取消信号。此外,文章还介绍了字节跳动开源的异步驱动器monoio,它支持以io-uring驱动IO,并避免了buffer随着析构Future而意外释放的问题。文章最后提到了一些关于异步编程的研究和提案,包括RFC: run_to_completion_futures和Async destructors, async genericity and completion futures等。
"Rust异步编程的未来趋势是什么?" "如何优化Rust异步编程的性能和安全性?" "字节跳动如何通过monoio推动Rust异步编程的发展?"
客服
商务合作
小程序
服务号
折叠