一、庫引入
為了學習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 步要用的時間,我們可以用如下 表示每一步花費的時間...