F# Monkey

about

非同期処理(async)をかじってみた!

Summary

Asyncとはお仕事を管理する方法

お仕事を管理する方法を2つのパターンで考えると理解しやすいかも

お仕事をasync { お仕事 }async { ... }でかこむ

お仕事を人に任せる時は!をつける(let!とかdo!とかreturn!とか)
( ! をつけると async<’T> が ’T となる)

上司部下パターン( Parents - child pattern )

上司の仕事の段取りをもとにお仕事を処理する

こんなかんじ

// 3sec.後にhello0というおしごと
let helloAfter3seconds () = async {
    do! Async.Sleep(3000)
    stdout.WriteLine("hello0")
}

// 上司の仕事の段取り(仕事の段取りは管理者の仕事なので async {} でかこむ)
async {
    
    // 部下に仕事をおねがいする ( ひとに任せるので let! )
    // お仕事の名前は workA とでもしておく
    let! workA = helloAfter3seconds () |> Async.StartChild

    // 上司は上司で自分の仕事をする
    stdout.WriteLine("hello1")

    // 部下にお仕事の進捗状況をたずねる (ひとに任せていたものなので do!)
    // この場合の do は どうだったの? の どう(do)
    do! workA
} 

// 上司の仕事の段取りを実際に行動にうつす
|> Async.RunSynchronously

結果

hello1
hello0

同僚パターン ( flat pattern )

お仕事を手分けして一斉に処理する

// 3sec.後にhello0というおしごと
let helloAfter3seconds () = async {
    do! Async.Sleep(3000)
    stdout.WriteLine("hello0")
}

// hello1というおしごと
let hello1() = async {
  stdout.WriteLine("hello1")
}

// するべきお仕事をリスト化
[ helloAfter3seconds () ; hello1 () ]

// お仕事を各人に割り当てる
|> Async.Parallel

// 一斉にお仕事を処理する
// 早く終わった人から仕事をきりぬける
// 最後の人が終わったらお仕事終了
|> Async.RunSynchronously

結果

hello1
hello0
Remove all ads