tokio::spwan
from tokio
非同期処理のタスクをを並行して実行するための関数
docs
tutorial
Spawning|Tokio チュートリアル (日本語訳)
#wip
めっちゃ雑に言えば、新しいスレッド切ってそこに処理を逃がす感じ
(↑これは雑すぎるし間違っている)
めっちゃ昔にpythonでやってたやつにイメージが似てるmrsekut.icon
code:rs
use tokio::task;
#tokio::main
async fn main() {
let handle = task::spawn(async {
println!("Hello from spawned task!");
});
// スポーンしたタスクの完了を待つ
let _ = handle.await;
}
async {..}を引数に取り、これを新しい非同期タスクとして実行する
タスクは別スレッドで実行されることもある
戻り値はJoinHandle
await することでタスクの終了を待つことができる
JoinHandle<T> は Result<T, JoinError> を返す
タスクがパニックした場合は Err になる
code:rs
async fn func() {
let v = vec!1, 2, 3;
task::spawn(async {
// ^^^^^
// async block may outlive the current function,
// but it borrows v, which is owned by the current function.
println!("Here's a vec: {:?}", v);
});
}
spawnの中では、外で所有されているデータへの参照を含んではいけない
この制限、厳しすぎない?理屈はわかるけどmrsekut.icon
move keywordを使えば修正できる
async move {..}にすればいい
もしデータの一部が複数のタスクから非同期にアクセスあれる必要があるなら、Arc<T>などを使って共有する
https://zenn.dev/magurotuna/books/tokio-tutorial-ja/viewer/spawning#'static-境界