日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

我們一起聊聊如何編寫異步運行時通用庫?

來源: 責編: 時間:2024-05-07 09:15:18 221觀看
導讀如果你正在用Rust編寫異步應用程序,在某些情況下,你可能希望將代碼分成幾個子crate。這樣做的好處是:更好的封裝,在子系統之間有一個crate邊界,可以產生更清晰的代碼和定義更良好的API。不再需要這樣寫:pub(crate)。更快的

如果你正在用Rust編寫異步應用程序,在某些情況下,你可能希望將代碼分成幾個子crate。這樣做的好處是:3bO28資訊網——每日最新資訊28at.com

  • 更好的封裝,在子系統之間有一個crate邊界,可以產生更清晰的代碼和定義更良好的API。不再需要這樣寫:pub(crate)。
  • 更快的編譯,通過將一個大crate分解成幾個獨立的小crate,它們可以并發地編譯。

使用一個異步運行時,編寫異步運行時通用庫的好處是什么?3bO28資訊網——每日最新資訊28at.com

  • 可移植性,你可以很容易地切換到不同的異步運行時或wasm。
  • 保證正確性,針對tokio和async-std,測試一個庫就可以發現更多的bug,包括并發bug(由于任務執行順序模糊)和“未定義行為”(由于誤解異步運行時實現細節)

下面使用三種方法來實現異步運行時通用庫。3bO28資訊網——每日最新資訊28at.com

方法1,定義自己的異步運行時Trait3bO28資訊網——每日最新資訊28at.com

使用futures crate,可以編寫非常通用的庫代碼,但是time,sleep或timeout等操作必須依賴于異步運行時。這時,你可以定義自己的AsyncRuntime trait,并要求下游實現它。3bO28資訊網——每日最新資訊28at.com

use std::{future::Future, time::Duration};pub trait AsyncRuntime: Send + Sync + 'static {    type Delay: Future<Output = ()> + Send;    // 返回值必須是一個Future    fn sleep(duration: Duration) -> Self::Delay;}

可以像這樣使用上面的庫代碼:3bO28資訊網——每日最新資訊28at.com

async fn operation<R: AsyncRuntime>() {    R::sleep(Duration::from_millis(1)).await;}

下面是它如何實現的:3bO28資訊網——每日最新資訊28at.com

pub struct TokioRuntime;impl AsyncRuntime for TokioRuntime {    type Delay = tokio::time::Sleep;    fn sleep(duration: Duration) -> Self::Delay {        tokio::time::sleep(duration)    }}#[tokio::main]async fn main() {    operation::<TokioRuntime>().await;    println!("Hello, world!");}

方法2,在內部抽象異步運行時并公開特性標志3bO28資訊網——每日最新資訊28at.com

為了處理網絡連接或文件句柄,我們可以使用AsyncRead / AsyncWrite trait:3bO28資訊網——每日最新資訊28at.com

#[async_trait]pub(crate) trait AsyncRuntime: Send + Sync + 'static {    type Connection: AsyncRead + AsyncWrite + Send + Sync + 'static;    async fn connect(addr: SocketAddr) -> std::io::Result<Self::Connection>;}

可以像這樣使用上面的庫代碼:3bO28資訊網——每日最新資訊28at.com

async fn operation<R: AsyncRuntime>(conn: &mut R::Connection) where    R::Connection: Unpin,{    conn.write(b"some bytes").await;}

然后為每個異步運行時定義一個模塊:3bO28資訊網——每日最新資訊28at.com

#[cfg(feature = "runtime-async-std")]mod async_std_impl;#[cfg(feature = "runtime-async-std")]use async_std_impl::*;#[cfg(feature = "runtime-tokio")]mod tokio_impl;#[cfg(feature = "runtime-tokio")]use tokio_impl::*;

tokio_impl模塊:3bO28資訊網——每日最新資訊28at.com

mod tokio_impl {    use std::net::SocketAddr;    use async_trait::async_trait;    use crate::AsyncRuntime;    pub struct TokioRuntime;    #[async_trait]    impl AsyncRuntime for TokioRuntime {        type Connection = tokio::net::TcpStream;        async fn connect(addr: SocketAddr) -> std::io::Result<Self::Connection> {            tokio::net::TcpStream::connect(addr).await        }    }}

main函數代碼:3bO28資訊網——每日最新資訊28at.com

#[tokio::main]async fn main() {    let mut conn =        TokioRuntime::connect(SocketAddr::new(IpAddr::from_str("0.0.0.0").unwrap(), 8080))            .await            .unwrap();    operation::<TokioRuntime>(&mut conn).await;    println!("Hello, world!");}

方法3,維護一個異步運行時抽象庫3bO28資訊網——每日最新資訊28at.com

基本上,將使用的所有異步運行時api寫成一個包裝器庫。這樣做可能很繁瑣,但也有一個好處,即可以在一個地方為項目指定與異步運行時的所有交互,這對于調試或跟蹤非常方便。3bO28資訊網——每日最新資訊28at.com

例如,我們定義異步運行時抽象庫的名字為:common-async-runtime,它的異步任務處理代碼如下:3bO28資訊網——每日最新資訊28at.com

// common-async-runtime/tokio_task.rspub use tokio::task::{JoinHandle as TaskHandle};pub fn spawn_task<F, T>(future: F) -> TaskHandle<T>where    F: Future<Output = T> + Send + 'static,    T: Send + 'static,{    tokio::task::spawn(future)}

async-std的任務API與Tokio略有不同,這需要一些樣板文件:3bO28資訊網——每日最新資訊28at.com

// common-async-runtime/async_std_task.rspub struct TaskHandle<T>(async_std::task::JoinHandle<T>);pub fn spawn_task<F, T>(future: F) -> TaskHandle<T>where    F: Future<Output = T> + Send + 'static,    T: Send + 'static,{    TaskHandle(async_std::task::spawn(future))}#[derive(Debug)]pub struct JoinError;impl std::error::Error for JoinError {}impl<T> Future for TaskHandle<T> {    type Output = Result<T, JoinError>;    fn poll(        mut self: std::pin::Pin<&mut Self>,        cx: &mut std::task::Context<'_>,    ) -> std::task::Poll<Self::Output> {        match self.0.poll_unpin(cx) {            std::task::Poll::Ready(res) => std::task::Poll::Ready(Ok(res)),            std::task::Poll::Pending => std::task::Poll::Pending,        }    }}

在Cargo.toml中,你可以簡單地將common-async-runtime作為依賴項包含進來。這使得你的庫代碼很“純粹”,因為現在選擇異步運行時是由下游控制的。與方法1類似,這個crate可以在沒有任何異步運行時的情況下編譯,這很簡潔!3bO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-87039-0.html我們一起聊聊如何編寫異步運行時通用庫?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python 推導式在接口自動化里的運用

下一篇: .NET中的多線程超時處理實踐

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
裸体素人女欧美日韩| 国产视频亚洲精品| 欧美伊人久久大香线蕉综合69| 午夜国产精品影院在线观看| 久久精品网址| 欧美韩日精品| 欧美午夜精品| 国产无一区二区| 亚洲国产三级在线| 99国产精品国产精品毛片| 亚洲中无吗在线| 久久乐国产精品| 欧美日韩直播| 国产亚洲一级高清| 亚洲精品日韩综合观看成人91| 亚洲欧美一区二区三区极速播放| 久久影视三级福利片| 欧美日韩综合久久| 国产一区二区三区丝袜| 日韩西西人体444www| 久久av二区| 欧美日韩国产在线一区| 国产亚洲一区二区三区在线观看 | 99在线精品视频在线观看| 亚洲女同性videos| 欧美va天堂| 国产欧美一区二区三区久久| 亚洲精品国产精品国自产观看| 亚洲欧美自拍偷拍| 欧美精品在线播放| 黄色工厂这里只有精品| 亚洲嫩草精品久久| 欧美精品一区二区三区久久久竹菊 | 国产日韩精品电影| 国产精品九九| 在线播放亚洲| 国产欧美不卡| 日韩视频在线你懂得| 欧美亚洲系列| 欧美日本韩国一区| 伊人久久婷婷色综合98网| 亚洲视频在线观看免费| 免费视频亚洲| 国产自产女人91一区在线观看| 一区二区三区视频免费在线观看| 免费成人高清视频| 国产小视频国产精品| 亚洲午夜国产一区99re久久| 欧美成人综合一区| 好吊视频一区二区三区四区 | 欧美一区二区三区啪啪| 欧美美女喷水视频| 在线观看视频一区| 亚洲女性喷水在线观看一区| 欧美人与性动交α欧美精品济南到| 国产真实乱偷精品视频免| 亚洲一本视频| 欧美日韩亚洲91| 亚洲国产日韩在线一区模特| 久久影院亚洲| 尤物99国产成人精品视频| 欧美一区二区在线免费观看| 国产精品久久二区| 在线天堂一区av电影| 欧美日韩成人一区二区三区| 亚洲欧洲精品一区二区三区不卡| 亚洲午夜精品久久久久久浪潮| 欧美成人中文字幕在线| 在线播放中文字幕一区| 久久国产精品久久w女人spa| 国产精品亚发布| 亚洲午夜精品一区二区三区他趣| 欧美日韩精品二区| 日韩一本二本av| 欧美久久久久久久久久| 亚洲精品国精品久久99热一| 欧美成人tv| 99视频精品全国免费| 亚洲欧美综合| 国产精品欧美一区二区三区奶水 | 亚洲免费av观看| 欧美福利一区二区| 亚洲国产日韩一区二区| 欧美激情1区2区| 亚洲精品永久免费| 欧美日韩hd| 在线一区观看| 国产精品另类一区| 亚洲欧美在线磁力| 国产乱理伦片在线观看夜一区| 亚洲欧美三级在线| 国产日韩欧美日韩| 久久国产精品一区二区三区四区| 国产日本精品| 久久久久久久久久看片| 在线成人激情视频| 欧美成人午夜影院| 伊人久久噜噜噜躁狠狠躁| 久久最新视频| 最新日韩中文字幕| 欧美日韩中文在线| 亚洲欧美国产精品va在线观看 | 欧美日韩亚洲一区二| 亚洲在线第一页| 国产亚洲一区在线| 噜噜噜躁狠狠躁狠狠精品视频 | 伊人婷婷欧美激情| 欧美精品久久久久久久久老牛影院| 亚洲作爱视频| 国产精品午夜久久| 快射av在线播放一区| 亚洲国产欧美日韩| 一本色道久久综合亚洲精品按摩 | 国产精品一级| 久久久免费精品| 亚洲欧洲中文日韩久久av乱码| 欧美日韩精品三区| 小黄鸭精品密入口导航| 伊人久久亚洲美女图片| 欧美日韩成人网| 亚洲在线观看视频| 一色屋精品视频免费看| 欧美日韩国产综合久久| 欧美一区二区在线播放| 亚洲国产日韩精品| 国产精品嫩草久久久久| 老巨人导航500精品| 亚洲视频久久| 激情小说亚洲一区| 欧美色123| 久久久久久久久一区二区| 99精品国产在热久久| 国产三级欧美三级| 欧美精品一区二区久久婷婷| 新狼窝色av性久久久久久| 亚洲国产日韩精品| 国产日韩欧美精品综合| 欧美精品一区二区三区在线播放| 欧美一区二区三区在线| 亚洲黄页视频免费观看| 国产嫩草一区二区三区在线观看| 欧美成人精品在线播放| 性欧美8khd高清极品| 亚洲欧洲久久| 国产主播一区二区三区| 欧美视频一区在线观看| 蜜臀久久99精品久久久画质超高清 | 国产精品视频最多的网站| 欧美成人69av| 久久国产精品久久久久久电车| 99精品视频网| 在线观看视频一区二区欧美日韩| 国产精品久久久久久久免费软件 | 国产欧美1区2区3区| 欧美理论在线播放| 久久久久久久999| 伊人男人综合视频网| 国产精品色婷婷| 欧美精品一区二区视频 | 免费一区二区三区| 午夜精品视频在线观看| 99精品福利视频| 在线观看三级视频欧美| 国产欧美亚洲一区| 欧美日韩一区三区| 免费欧美视频| 久久久福利视频| 欧美亚洲午夜视频在线观看| 99精品视频一区| 尤物九九久久国产精品的分类| 国产欧美丝祙| 国产精品毛片在线看| 欧美日韩视频在线一区二区观看视频| 蜜臀a∨国产成人精品 | 香港成人在线视频| 正在播放日韩| 艳妇臀荡乳欲伦亚洲一区| 亚洲三级国产| 亚洲国产精品久久久久婷婷老年 | 欧美激情视频一区二区三区免费| 久久手机精品视频| 久久精品天堂| 久久激情综合| 欧美亚洲系列| 午夜一区在线| 欧美一区成人| 欧美一区二区三区另类 | 欧美成年人网站| 久久综合给合久久狠狠色| 久久久999精品| 久久国产精品色婷婷| 久久成年人视频| 欧美一级片在线播放| 亚洲欧美另类国产| 亚洲欧美视频| 午夜欧美电影在线观看| 午夜欧美大片免费观看| 羞羞漫画18久久大片| 欧美一二三区精品| 欧美自拍偷拍午夜视频| 久久精品国产亚洲aⅴ| 久久精品论坛| 久久综合激情| 欧美国产日韩精品|