tokio學習筆記(一)

2021-10-11 16:26:11 字數 4534 閱讀 3918

一、庫引入

為了學習tokio庫的全部特性,cargo.toml的配置如下:

[dependencies]

tokio =

二、task使用示例

1.最簡單的示例,驗證tokio庫匯入成功,並能夠成功執行。

#[tokio::main] //此處引入tokio 巨集/macro

async fn main()

2.tokio任務阻塞+await示例

use std::thread::sleep;

use tokio::time::duration;

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() ).await.unwrap();//使用await關鍵字等待阻塞執行緒的任務完成

//要等待阻塞執行緒完成後,主線程才能執行

println!("hello");

}

這個示例執行的結果是,等待10s後先輸出hi,後輸出hello。

3.tokio任務阻塞示例

use std::thread::sleep;

use tokio::time::duration;

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );//此處未使用await關鍵字等待阻塞執行緒的任務完成

//無需等待阻塞執行緒完成,主線程直接執行

println!("hello");

}

這個示例執行的結果是,先輸出hello,然後等待10s輸出hi

4.tokio任務不阻塞+await示例

use std::thread::sleep;

use tokio::time::duration;

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() ).await.unwrap();//使用await關鍵字等待阻塞執行緒的任務完成

//要等待執行緒完成後,主線程才能執行

println!("hello");

}

這個示例執行的結果是,等待10s後先輸出hi,後輸出hello。

5.tokio任務不阻塞示例

use std::thread::sleep;

use tokio::time::duration;

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );//此處未使用await關鍵字等待阻塞執行緒的任務完成

//無需等待阻塞執行緒完成,主線程直接執行

println!("hello");

}

這個示例執行的結果是,先輸出hello,然後等待10s輸出hi

6.tokio多工不阻塞示例

use std::thread::sleep;

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );

tokio::task::spawn(async );

println!("hello");

}

這個示例執行的結果是,先輸出hello,後輸出hi1和hi2,hi1和h2的出現順序是不確定的。

7.tokio多工不阻塞+單await示例

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() ).await;

tokio::task::spawn(async );

println!("hello");//切到主線程,第二輸出

}

這個示例執行的結果是,先等待h1輸出,而後輸出hello,最後輸出hi2,也可能不輸出hi2.

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );

tokio::task::spawn(async ).await;

println!("hello");//主線程最後執行

}

這個示例執行的結果是,可能先輸出hi2,再輸出hi1,最後輸出hello,也可能是先輸出hi1,再輸出hi2,最後輸出hello(這種可能性高)

8.tokio多工阻塞示例

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );

tokio::task::spawn_blocking(|| );

println!("hello");//因為任務處於阻塞,主線程最先輸出

}

這個示例執行的結果是,先輸出hello,再輸出hi1和hi2,h1和h2輸出順序不定,為什麼主線程在輸出後不直接退出?因為還有任務處於阻塞沒有返回,只有阻塞的任務完成,程式才會退出。

9.tokio多工阻塞+單await示例

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() ).await;

tokio::task::spawn_blocking(|| );

println!("hello");

}

這個示例執行的結果是,先輸出hi1,然後輸出hello,最後輸出hi2

#[tokio::main] //此處引入tokio 巨集/macro

async fn main() );

tokio::task::spawn_blocking(|| ).await;

println!("hello");

}

這個示例執行的結果是,先輸出hi1,然後輸出hi2,最後輸出hello

10.單執行緒環境下任務阻塞和任務不阻塞示例

use tokio::runtime::;

use std::thread::sleep;

use tokio::time::duration;

fn main() );

runtime.spawn(async );

println!("hello");

}

這個示例執行的結果是,先輸出hello,再輸出hi1,再輸出hi2,這個輸出順序是確定的,和示例6有所區別

use tokio::runtime::;

use std::thread::sleep;

use tokio::time::duration;

fn main() );

runtime.spawn(async );

println!("hello");

}

這個示例執行的結果是,先輸出hello,等待10s,之後輸出hi1,再輸出hi2

use tokio::runtime::;

use std::thread::sleep;

use tokio::time::duration;

fn main() );

runtime.spawn(async );

println!("hello");

}

這個示例執行的結果是,先輸出hello,之後輸出hi2,等待10s,再輸出hi2

總結:可以看出tokio任務阻塞和任務不阻塞的功能大致相同。它們的區別是:tokio::task::spawn開啟的任務不應執行可能阻塞的操作,這個任務如果阻塞,這個任務執行時的執行緒就會被阻塞,在這個執行緒下的其它任務也會被影響到,直到阻塞消除。tokio::task::spawn_blocking開啟的任務可以執行阻塞操作,開啟的任務執行在乙個專屬的執行緒池中,這個任務如果阻塞,不會影響到其它任務的完成。

11.block_in_place使用示例

#[tokio::main]

async fn main() );

tokio::task::block_in_place(|| );

println!("hello")

}

這個示例的執行結果是:先輸出hi1,再輸出hi2,最後輸出hello

block_in_place作用和spawn_blocking作用類似,不同之處是,前者阻塞當前執行緒,等待任務完成後,再將當前執行緒中的其他任務中轉移到另外乙個執行緒執行,後者是將當前任務放到專屬的執行緒池中,執行緒池選擇乙個執行緒阻塞等待任務完成,而當前的執行緒不會被阻塞。

12.yield_now使用示例

#[tokio::main]

async fn main() );

tokio::task::spawn(async ).await.unwrap();

println!("hello")

}

這個示例的執行結果:先輸出hi1,再輸出hi2 ,最後輸出hello

學習筆記一

lisp 最重要的一種執行模式之一 repl that endless cycle of reading,evaluating,and printing is why it s called the read eval print loop or repl.第乙個lisp程式 在repl模式下執行l...

學習筆記 一

什麼是seo?搜尋引擎優化 search engine optimization,簡稱seo 是一種利用搜尋引擎的搜尋規則來提高目的 在有關搜尋引擎內的排名的方式。深刻理解是 通過seo這樣一套基於搜尋引擎的營銷思路,為 提供生態式的自我營銷解決方案,讓 在行業內佔據領先地位,從而獲得品牌收益。研究...

學習筆記一

今天兩節課,也就是兩個問題的分析裝配線排程問題和矩陣鏈相乘ai,j中的 i,j 分別表示的是第 i 條線路的第 j 個步驟,每個線路每條步驟都有不同的用時,還有t i j中的 i,j 表示的就是從第 i 條線路第 j 步到達另外一條線路的第 j 1 步要用的時間,我們可以用如下 表示每一步花費的時間...