最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

RUST異步流處理方法詳細(xì)講解

 更新時(shí)間:2022年12月16日 09:49:37   作者:上后左愛  
這篇文章主要介紹了RUST異步流處理方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧

Stream 特質(zhì)

在同步Rust 中流的核心是Iterator 提供了一種在序列中產(chǎn)生項(xiàng)的方法,并在它們之間進(jìn)行阻塞,通過(guò)迭代器傳遞給其他迭代器

在異步Rust中流的核心Stream, 允許其他任務(wù)在當(dāng)前阻塞等待時(shí)允許

Read/Write, AsyncRead/AsyncWrite

fn main() {
    let f = file::create("E:\\foot.txt").await?;
    f.write_all(b"hello world").await?;
    let f = file::open("E:\\foot.txt").await?;
    let mut buffer = Vec::new();
    f.read_to_end(&mut buffer).await?;
}

Stream 經(jīng)典子流

source: 可以生成數(shù)據(jù)流

Sink: 可以消費(fèi)數(shù)據(jù)流

Through: 消費(fèi)數(shù)據(jù),對(duì)其進(jìn)行操作生成新數(shù)據(jù)流

Duplex: 流可以生成數(shù)據(jù),也可以獨(dú)立消費(fèi)數(shù)據(jù)(AsyncWrite/Read)

asyncread 和 Stream 區(qū)別

這兩種對(duì)byte 進(jìn)行操作,AsyncRead 只能對(duì)byte進(jìn)行操作(生成未解析數(shù)據(jù)),Stream對(duì)任何類型的數(shù)據(jù)進(jìn)行操作(生成解析數(shù)據(jù))

使用for_each_concurrent, try_for_each_concurrent 進(jìn)行并發(fā)的處理流,進(jìn)行流的處理

yield 匿名流

在async 異步過(guò)程中使用yield 關(guān)鍵字, 類似于Python 迭代產(chǎn)生時(shí)候可以返回,下一次從上一次返回值在進(jìn)行開始跌打

try_join

如果某個(gè)發(fā)生錯(cuò)誤后會(huì)立即返回?cái)?shù)據(jù)

使用try_join 需要函數(shù)返回結(jié)果,并且錯(cuò)誤的類型,才能正常運(yùn)行

use futures;
use tokio::runtime::Runtime;
use std::io::Result;
async fn func1() -> Result<()> {
    tokio::time::delay_for(tokio::time::Duration::from_secs(1)).await;
    println!("func1 finished!");
	Ok(())
}
async fn func2() -> Result<()> {
    println!("func2 finished!");
	Ok(())
}
async fn async_main() {
    let f1 = func1();
    let f2 = func2();

    if let Err(_) = futures::try_join!(f1, f2) {
		println!("Err!");
	}
}
fn main() {
    let mut runtime = Runtime::new().unwrap();
    runtime.block_on(async_main());
    println!("Hello, world!");
}

select

使用場(chǎng)景 有三個(gè)運(yùn)行任務(wù) ,只要其中一個(gè)完成后立馬返回,使用select

在使用select啟動(dòng)使用pin_mut!(f1, f2), 使用select! 進(jìn)行匹配

use futures::{select, future::FutureExt, pin_mut};
use tokio::runtime::Runtime;
use std::io::Result;
async fn func1() -> Result<()> {
	tokio::time::delay_for(tokio::time::Duration::from_secs(2)).await;
	println!("func1 finished!");
	Ok(())
}
async fn func2() -> Result<()> {
	println!("func2 finished!");
	Ok(())
}
async fn async_main() {
	let f1 = func1().fuse();
	let f2 = func2().fuse();
	pin_mut!(f1, f2);
	// 使用select 進(jìn)行匹配
	select! {
		_ = f1 => println!("func1 finished++++++!"),
		_ = f2 => println!("func2 finished++++++!"),
	}
}
fn main() {
// 使用tokio的runtime()
	let mut runtime = Runtime::new().unwrap();
	runtime.block_on(async_main());
    println!("Hello, world!");
}

select! y與default/complete 一起聯(lián)合使用

complete :表示兩個(gè)都已經(jīng)就緒,default表示兩個(gè)都沒(méi)有就緒

use futures::{future, select, executor};
async fn count() {
	let mut a_fut = future::ready(4);
	let mut b_fut = future::ready(6);
	let mut total = 0;	
	loop {
		select! {
			a = a_fut => total += a,
			b = b_fut => total += b,
			complete => break,   //表示所有的分支都已經(jīng)完成,并且不會(huì)再取得進(jìn)展的情況
			default => unreachable!(), //表示沒(méi)有分支完成
		}
	}
	assert_eq!(total, 10);
}
fn main() {
	executor::block_on(count());
    println!("Hello, world!");
}

complete 表示所有分支都已經(jīng)完成,并且不會(huì)取得進(jìn)展的情況,如上所示,使用loop 第一次b分支準(zhǔn)備好,下一次循環(huán)可能是a分支,最后兩個(gè)分支都已經(jīng)完成后 就break退出

complete 類似讓所有分支都完成后直接退出

SELECT宏幾個(gè)條件

  • select中使用Future必須首先UnPinFuture trait, Fused trait
  • 必須實(shí)現(xiàn)UnpinFuture原因在于select! 不是按照值獲取,按照引用獲取,這樣能夠在不獲取future所有權(quán)條件下,未完成的future可以繼續(xù)使用
  • 必須實(shí)現(xiàn)FusedFuture: select 完成后不在輪詢future,因此需要實(shí)現(xiàn)FusedFuture 跟蹤Future是否完成
  • 如果select使用stream,其stream 也是需要實(shí)現(xiàn)FusedStream

async 問(wèn)號(hào)使用

如果返回類型有Result<T, E> 結(jié)果使用.await?

Send trait

在保證多線程安全時(shí)候 需要保證接口實(shí)現(xiàn)Send trait 、sync trait 才能保證多線程的安全

Send trait 表示數(shù)據(jù)能夠在線程間安全的發(fā)送,sync trait 能夠保證線程安全的引用

use std::rc::Rc;
#[derive(Default)]
struct NoSend(Rc<()>);
async fn bar() {}
async fn foo() {
	NoSend::default();
	//{
	//	let x = NoSend::default();
	//	//to do : xxxxx
	//}
	let _ = NoSend::default();
	bar().await;
}
//Send trait:如果所有的子類型都是實(shí)現(xiàn)Send trait的,那么它本身也是實(shí)現(xiàn)Send Trait的
// 如果內(nèi)部沒(méi)有定義 只是使用 是一個(gè)Send Trait 主要是在 生成 匿名結(jié)構(gòu)體中 會(huì)進(jìn)行解析
not let x: impl Send Trait
//struct Foo {
//	f: Future,
//}
let x: Not impl Send Trait
//struct Foo {
//	x: NoSend, //not impl Send Trait
//	f: Future, //impl Send Trait
//}
fn required_send(_: impl Send) {}
fn main() {
	required_send(foo());
    println!("Hello, world!");
}

到此這篇關(guān)于RUST異步流處理方法詳細(xì)講解的文章就介紹到這了,更多相關(guān)RUST異步流處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • Rust中的函數(shù)指針詳解

    Rust中的函數(shù)指針詳解

    Rust是一種現(xiàn)代的系統(tǒng)編程語(yǔ)言,它支持函數(shù)指針。函數(shù)指針是指向函數(shù)的指針,可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)或存儲(chǔ)在變量中。Rust中的函數(shù)指針可以用于實(shí)現(xiàn)回調(diào)函數(shù)、動(dòng)態(tài)分發(fā)和多態(tài)等功能。本文將介紹Rust中的函數(shù)指針的基本用法和高級(jí)用法。
    2023-05-05
  • Rust處理命令行參數(shù)

    Rust處理命令行參數(shù)

    在Rust中,命令行參數(shù)是程序從命令行接收的輸入,它們?yōu)槌绦蛱峁┝诉\(yùn)行時(shí)配置和數(shù)據(jù)的靈活性,本文就來(lái)介紹一下Rust處理命令行參數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Rust語(yǔ)言中級(jí)教程之指針

    Rust語(yǔ)言中級(jí)教程之指針

    Rust中共有三種類型的指針,分別為引用,解引用,智能指針,這篇文章主要介紹了Rust語(yǔ)言中級(jí)教程之指針,需要的朋友可以參考下
    2023-05-05
  • Rust語(yǔ)言從入門到精通之Tokio的Channel深入理解

    Rust語(yǔ)言從入門到精通之Tokio的Channel深入理解

    這篇文章主要為大家介紹了Rust語(yǔ)言從入門到精通之Tokio的Channel深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)

    Rust重載運(yùn)算符之復(fù)數(shù)四則運(yùn)算的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Rust如何實(shí)現(xiàn)復(fù)數(shù)以及復(fù)數(shù)的四則運(yùn)算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-08-08
  • 通過(guò)rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    通過(guò)rust實(shí)現(xiàn)自己的web登錄圖片驗(yàn)證碼功能

    本文介紹了如何使用Rust和imagecrate庫(kù)生成圖像驗(yàn)證碼,首先,通過(guò)Cargo.toml文件添加image依賴,然后,生成純色圖片并編輯驗(yàn)證圖片,接著,編寫隨機(jī)函數(shù)獲取字符,并通過(guò)循環(huán)生成驗(yàn)證碼圖片,最終,通過(guò)運(yùn)行函數(shù)驗(yàn)證驗(yàn)證碼圖片是否生成,感興趣的朋友一起看看吧
    2025-03-03
  • Rust個(gè)人學(xué)習(xí)小結(jié)之Rust的循環(huán)

    Rust個(gè)人學(xué)習(xí)小結(jié)之Rust的循環(huán)

    這篇文章主要介紹了Rust個(gè)人學(xué)習(xí)小結(jié)之Rust的循環(huán),今天主要了解了Rust語(yǔ)言的3種循環(huán)方法:?loop、while、for,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • Rust中字符串類型String的46種常用方法分享

    Rust中字符串類型String的46種常用方法分享

    Rust主要有兩種類型的字符串:&str和String,本文主要為大家介紹的是String類型的字符串以及它常用的46種方法,感興趣的小伙伴可以了解一下
    2023-06-06
  • Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    Rust?搭建一個(gè)小程序運(yùn)行環(huán)境的方法詳解

    rust是一門比較新的編程語(yǔ)言,2015年5月15日,Rust編程語(yǔ)言核心團(tuán)隊(duì)正式宣布發(fā)布Rust?1.0版本,本文給大家介紹Rust?搭建一個(gè)小程序運(yùn)行環(huán)境,以iOS?為例介紹開發(fā)環(huán)境的準(zhǔn)備,感興趣的朋友跟隨小編一起看看吧
    2022-05-05
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust?還有另外一種不持有所有權(quán)的數(shù)據(jù)類型:切片(slice),切片允許我們引用集合中某一段連續(xù)的元素序列,而不是整個(gè)集合。本文讓我們來(lái)深入了解Rust的切片
    2022-11-11

最新評(píng)論

茌平县| 金川县| 云龙县| 博白县| 岱山县| 墨脱县| 姜堰市| 娄底市| 平武县| 堆龙德庆县| 新绛县| 大港区| 唐海县| 松桃| 肃宁县| 黎川县| 汤阴县| 淮滨县| 信阳市| 泰顺县| 丰镇市| 达日县| 建始县| 光泽县| 竹北市| 武隆县| 东平县| 潞城市| 璧山县| 营口市| 娄底市| 南开区| 邹城市| 桓仁| 怀化市| 贵南县| 桐梓县| 佛教| 太和县| 平江县| 定边县|