callmekohei's blog

callmekoheiのひとりごと

(F#) Concurrent Queue, Stack and Bag のメモ

ConcurrentQueue

open System.Collections.Concurrent

// ConcurrentQueue クラスは
// thread-safe な queue(FIFO) コレクション
let cq = new ConcurrentQueue<int>()

// Enqueue
[0..9999] |> List.iter cq.Enqueue

// Dequeue
let dequeue = async {
    let mutable subTotal = 0
    while not cq.IsEmpty do
        subTotal <- subTotal + ( cq.TryDequeue() |> snd )
    return subTotal
}

List.init 10 ( fun _ -> dequeue )   // dequeueを10個つくる
|> Async.Parallel                   // パラレルで処理をする
|> Async.StartAsTask                // タスクとして実行
|> fun x -> x.Result                // タスクの結果をとりだす [|13859507; 8933578; 0; 14053043; 0; 0; 13148872; 0; 0; 0|]
|> Array.sum                        // それぞれのタスクの結果を合計する
|> printfn "%A"                     // 結果 49995000


ConcurrentStack

open System.Collections.Concurrent

// ConcurrentStack クラスは
// thread-safe な queue(LIFO) コレクション
let cs = new ConcurrentStack<int>()

// Push
[0..9999] |> List.iter cs.Push

// Pop
let dequeue = async {
    let mutable subTotal = 0
    while not cs.IsEmpty do
        subTotal <- subTotal + ( cs.TryPop() |> snd )
    return subTotal
}

List.init 10 ( fun _ -> dequeue )   // dequeueを10個つくる
|> Async.Parallel                   // パラレルで処理をする
|> Async.StartAsTask                // タスクとして実行
|> fun x -> x.Result                // タスクの結果をとりだす [|13859507; 8933578; 0; 14053043; 0; 0; 13148872; 0; 0; 0|]
|> Array.sum                        // それぞれのタスクの結果を合計する
|> printfn "%A"                     // 結果 49995000


ConcurrentBag

open System.Collections.Concurrent

// ConcurrentBag クラスは
// thread-safe な non-order コレクション
let cb = new ConcurrentBag<int>()

// Add
[0..9999] |> List.iter cb.Add

// Take
let dequeue = async {
    let mutable subTotal = 0
    while not cb.IsEmpty do
        subTotal <- subTotal + ( cb.TryTake() |> snd )
    return subTotal
}

List.init 10 ( fun _ -> dequeue )   // dequeueを10個つくる
|> Async.Parallel                   // パラレルで処理をする
|> Async.StartAsTask                // タスクとして実行
|> fun x -> x.Result                // タスクの結果をとりだす [|13859507; 8933578; 0; 14053043; 0; 0; 13148872; 0; 0; 0|]
|> Array.sum                        // それぞれのタスクの結果を合計する
|> printfn "%A"                     // 結果 49995000
Remove all ads