Async/Await入門
非同期でノンブロッキングなコードを書くための、`async`関数と`await`式の基礎を学びます。
「Async/Await入門」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全3レッスンが含まれています。
非同期プログラミングとは
プログラミングでは、処理中に待機が発生することがよくあります。ファイルの読み込み、ネットワーク要求の完了、データベースクエリの結果などを待つ場合があります。
従来のプログラムは、このような待機中にブロックします。つまり、処理が完了するまで他のすべての操作を停止します。そのため、アプリケーションの動作が遅くなったり、応答しなくなったりすることがあります。
コードが待機するとき…
ブロッキング処理の簡単な例を考えてみましょう。このプログラムは、2つ目のメッセージを出力する前に2秒間停止します。
実行してみましょう。
use std::thread;
use std::time::Duration;
fn main() {
println!("Starting a blocking task...");
thread::sleep(Duration::from_secs(2)); // This blocks!
println!("Blocking task finished!");
}待機によるコスト
前の例では、プログラム全体が待機しました。これがWebサーバーだった場合、あるユーザーの要求がデータベースを待機している間、他のユーザーにはサービスを提供できないことになります。
非同期プログラミングを使うと、長時間かかる処理を開始した後、待機する代わりに別の処理へ進むことができます。長時間の処理が準備できたら、後からその処理を再開できます。
Rustの非同期アプローチ
Rustは、非同期プログラミングのために強力な言語機能であるasyncキーワードとawaitキーワードを提供します。
async関数は、一時停止と再開が可能な特殊な関数です。.awaitはasync関数内で使用し、プログラム全体をブロックせずに別の非同期タスクの完了を待機します。
`async`関数を定義する
fnの前にasyncキーワードを追加すると、非同期関数を宣言できます。async関数は常にFutureを返します。
Futureは、まだ準備できていない可能性がある値です。最終的に結果を生成する計算を表します。
async fn my_async_task() -> u32 {
// This task will eventually return 42
42
}`.await`で一時停止する
.awaitキーワードによって、非同期プログラミングはノンブロッキングになります。Futureを.awaitすると、async関数は次のように動作します。
- 自身の実行を一時停止します。
- プログラムが他の処理を実行できるようにします。
- 待機していたFutureの準備が整うと再開します。
別のタスクが完了するまで、現在のタスクを一時停止ボタンで止めておくようなものです。
非同期コードを実行する:エグゼキューター
async関数はFutureを返しますが、その内部のコードがすぐに実行されるわけではありません。Futureは遅延評価されます。
async関数を実際に実行してFutureを処理するには、エグゼキューターが必要です。簡単な例では、現在のスレッド上でFutureを完了まで実行するfutures::executor::block_onを使用できます。
最初の`async`/`await`プログラム
async、await、そして簡単なエグゼキューターがどのように連携するかを見てみましょう。mainでblock_onを使い、非同期処理を開始している点に注目してください。
この例では、main関数のスレッドをブロックせずに非同期の遅延をシミュレートしています(概念的な説明です。block_on自体はFutureが完了するまでブロックしますが、非同期タスク自体は処理を譲渡します)。
use futures::executor::block_on;
use std::time::Duration;
async fn learn_and_wait() {
println!("Learning asynchronously...");
// Simulate an async operation that takes time
// In a real app, this would be an I/O op
tokio::time::sleep(Duration::from_secs(1)).await;
println!("Finished learning!");
}
fn main() {
println!("Starting main function.");
block_on(learn_and_wait());
println!("Main function finished.");
}`Future`トレイトを理解する
async fn my_func()と記述すると、Rustは実際にはそれをFutureトレイトを実装するステートマシンへ変換します。
Futureトレイトには、主なメソッドとしてpollがあります。エグゼキューターはこれを繰り返し呼び出し、タスクが処理を進める準備ができたかを確認します。Futureを.awaitすると、処理が完了するまで別のFutureをポーリングするようエグゼキューターに伝えます。
クイックチェック:Async/Awaitの基礎
asyncとawaitの基礎を学びました。主要な役割を見分けられるか確認してみましょう。
振り返りと次のステップ
すばらしいです!非同期 Rust プログラミングへの第一歩を踏み出しました。
- 同期コードブロックでは、プログラムが待機することがわかりました。
- 非同期コードを使うと、ブロックせずにタスクを並行して実行できます。
asyncキーワードは非同期関数を宣言します。この関数は Future を返します。.awaitキーワードは、Future の準備が整うまでasync関数を一時停止します。- Future を実行するには、
block_onのようなエグゼキューターが必要です。
次は、Rust で実際の非同期アプリケーションを構築するための強力なランタイムおよびエコシステムである Tokio について詳しく学びます。
よくある質問
「Async/Await入門」レッスンは無料ですか?
はい。「Async/Await入門」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全3レッスンが含まれています。
「Async/Await入門」で何を学びますか?
非同期でノンブロッキングなコードを書くための、`async`関数と`await`式の基礎を学びます。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn Rust Codingを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「Async/Await入門」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn Rust Codingレッスンでコードを書いて実行できますか?
はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Async/Await入門
- Tokioで非同期アプリケーションを構築する
- Futureとタスクを扱う