2019-12-02に更新

かきかけ☆(^~^)

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 Rust 1.39.0 の async/await をはよ覚えないと……☆」

# Rustをバージョンアップさせるなら☆(^~^)
cd C:\Users\むずでょ\.cargo\bin
rustup update

KIFUWARABE_80x100x8_01_Futu.gif
「 あと30分で おでかけ の時間だな☆」

Async-await on stable Rust!
rust-lang/rfcs
async/.await Primer

async fn hello_world() {
    println!("hello, world!");
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 非同期処理したい関数の頭に async 修飾するのが Rust のやり方らしいぜ☆」

OKAZAKI_Yumemi_80x80x8_02_Syaberu.gif
「  async 修飾された関数は どうやって使うの?」

fn main() {
    let future = hello_world(); // Nothing is printed
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 同期処理も、非同期処理も、関数呼び出しの見た目は同じだぜ☆
ただし、 async が付いた関数は 本体が実行されるのではなく、
future オブジェクトを返すぜ☆」

https://crates.io/search?q=futures

Cargo.toml:

[dependencies]
futures = "0.3.1"
use futures::executor::block_on;

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 future オブジェクトは標準では実行できないので、クレートを使う☆」

    block_on(future); // `future` is run and "hello, world!" is printed

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 block_on() は future を実行する☆」

Synchronized:

fn main() {
    println!("hello, world!");
}

Asyncronized:

use futures::executor::block_on;

async fn hello_world() {
    println!("hello, world!");
}

fn main() {
    let future = hello_world(); // Nothing is printed
    block_on(future); // `future` is run and "hello, world!" is printed
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 同期処理と、非同期処理で、それほどプログラマーの 負担は増えないな☆」

連続実行

// cd C:\Users\むずでょ\source\repos\practice-rust\async-await
// cargo check --example join
// cargo build --example join
// cargo run --example join
//
// See also:
// https://crates.io/
use futures::executor::block_on;

async fn say_apple() {
    println!("apple!");
}

async fn say_banana() {
    println!("banana!");
}

async fn say_mix_juice() {
    // こう書いても順次に動きはするが……☆(^~^)
    say_apple().await;
    say_banana().await;
}

fn main() {
    let future = say_mix_juice();
    block_on(future);
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 非同期処理を順次実行しても嬉しくないよな☆
並列に動いてほしいときは……☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 スリープをいれて もっと確かめるか☆」

// cd C:\Users\むずでょ\source\repos\practice-rust\async-await
// cargo check --example join
// cargo build --example join
// cargo run --example join
//
// See also:
// https://crates.io/
use futures::executor::block_on;
use std::thread;
use std::time::Duration;

async fn say_apple() {
    print!("app");
    thread::sleep(Duration::from_secs(1));
    println!("le!");
}

async fn say_banana() {
    print!("ban");
    thread::sleep(Duration::from_secs(1));
    println!("ana!");
}

async fn say_cherry() {
    print!("che");
    thread::sleep(Duration::from_secs(1));
    println!("rry!");
}

async fn say_mix_juice() {
    say_apple().await;
    say_banana().await;
    say_cherry().await;
}

fn main() {
    let future = say_mix_juice();
    block_on(future);
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑スリープするタイミングが 思ってるのと違う……☆
スリープは カレント・スレッドをスリープさせるが、
非同期処理の block_on が使ってる方のスレッドはスリープさせないんだろうか……☆?」

async fn say_mix_juice() {
    /*
    say_apple().await;
    say_banana().await;
    say_cherry().await;
    */
    futures::join!(say_apple(), say_banana(), say_cherry());
}

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 ↑join! を使っても結果は同じ☆」

KITASHIRAKAWA_Chiyuri_80x100x8_01_Futu.gif
「 うーむ、ドキュメントは async/await 構文周りの話しだけで
非同期処理は ライブラリを調べた方がいいのか……☆?」

<書きかけ>

何度でもクリック!→

むずでょ

光速のアカウント凍結されちゃったんで……。ゲームプログラムを独習中なんだぜ☆電王戦IIに出た棋士もコンピューターもみんな好きだぜ☆▲(パソコン将棋)WCSC29一次予選36位、SDT5予選42位▲(パソコン囲碁)AI竜星戦予選16位

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

むずでょ の最近の記事