Skip to content

Part VI: ノンブロッキング I/O

概要

本章では、F# の Async を使用したノンブロッキング I/O を学びます。


ブロッキング vs ノンブロッキング

ブロッキング I/O

// スレッドは I/O 完了まで待機
let content = File.ReadAllText("file.txt")

ノンブロッキング I/O (Async)

let readFileAsync (path: string) : Async<string> =
    async {
        use reader = new StreamReader(path)
        let! content = reader.ReadToEndAsync() |> Async.AwaitTask
        return content
    }

Async の基本

// 非同期計算を定義(実行されない)
let fetchData (url: string) : Async<string> =
    async {
        use client = new HttpClient()
        let! response = client.GetStringAsync(url) |> Async.AwaitTask
        return response
    }

// 同期的に実行
let result = Async.RunSynchronously (fetchData "https://example.com")

// 非同期的に開始
Async.Start (async {
    let! result = fetchData "https://example.com"
    printfn "%s" result
})

並列 Async

let downloadAll (urls: string list) : Async<string[]> =
    urls
    |> List.map fetchData
    |> Async.Parallel

// 使用例
let results =
    ["https://a.com"; "https://b.com"; "https://c.com"]
    |> downloadAll
    |> Async.RunSynchronously

メリット

項目 ブロッキング Async
スレッド消費 待機中も占有 解放
スケーラビリティ 低い 高い
コード複雑さ 低い やや高い

次のステップ

Part VII では、Async ワークフローの詳細を学びます。