我需要運行一個從串列中運行某些東西的行程——它以什么順序運行并不重要——但我希望它在完成每項任務后更新一個全域“計數器”,以便我可以在某處看到進度否則(可能使用類似信號 R 的東西)
我曾經以面向物件的方式來做這些事情——但試圖變得更“實用”。
let doSomethingElse(value: int) = async{
// Update a global counter incrementing it by 1
return true
}
let doSomething() = async{
let values = [2; 4; 6; 8]
let! newList = values |> List.map(fun value -> doSomethingElse(value)) |> Async.Parallel
return true
}
uj5u.com熱心網友回復:
按照@JL0PD提到的內容,您可以執行以下操作。
[<RequireQualifiedAccess>]
module Async =
let tee (f: _ -> unit) a =
async {
let! r = a
f r
return r
}
module Counter =
let create () =
let mutable counter = 0
let increment =
fun _ ->
counter <- counter 1
()
(increment, fun () -> counter)
let doSomethingElse(value: int) = async {
return value % 2
}
let doSomething() = async {
let values = [1; 2; 4; 6; 8; 9]
let increment, getCount = Counter.create()
let doSomethingElseWithProgress =
doSomethingElse
>> (Async.tee increment)
let! _ =
values
|> List.map doSomethingElseWithProgress
|> Async.Parallel
return getCount() = (List.length values)
}
doSomething ()
|> Async.RunSynchronously
我確實建議做一些比可變計數器更好的事情,特別是因為您正在處理并行任務。
在這種情況下,我正在撰寫doSomethingElse和increment使用tee,這種方式doSomethingElse不必知道(和呼叫)外部函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498352.html
