gpt4 book ai didi

list - F# 列表中的 Task.WaitAll

转载 作者:行者123 更新时间:2023-12-04 23:08:58 28 4
gpt4 key购买 nike

我正在使用 F# 进行并行编程。对于固定数量的元素,例如有 2 个元素 a1、a2 和函数 f,我可以执行以下操作:

let t1 = Task.Factory.StartNew(fun () -> f a1)
let t2 = Task.Factory.StartNew(fun () -> f a2)
Task.WaitAll(t1, t2)
t1.Result, t2.Result

我想知道如何对元素列表做同样的事情:
let ts = List.map (fun a -> Task.Factory.StartNew(fun () -> f a))
Task.WaitAll(ts)
List.map (fun (t: Task<_>) -> t.Result) ts

Visual Studio 发现 Task.WaitAll 不能接受 Task 列表作为其参数。 Task.WaitAll 可以将 Task [] 作为其参数,但这没有意义,因为我需要为下一次计算获取 Result。

最佳答案

正如罗伯特解释的那样,如果你想调用 WaitAll ,你必须将元素序列转换为基本类型 Task ,然后将其转换为数组。您可以为 Task 定义扩展成员以使 tas 更简单:

type System.Threading.Tasks.Task with
static member WaitAll(ts) =
Task.WaitAll [| for t in ts -> t :> Task |]

我正在使用数组理解和强制转换而不是 Seq.cast,因为 Seq.cast 采用无类型的 IEnumerable - 所以 F# 为扩展方法推断出更好的类型。

另一种选择是根本不调用 WaitAll - 如果您不这样做, Result 属性将阻塞,直到任务完成。这意味着无论如何你都会阻塞线程(阻塞的数量可能会多一些,但我不确定它是否对性能影响太大)。如果您使用 List.map 收集所有结果,则行为几乎相同。

关于list - F# 列表中的 Task.WaitAll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5116712/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com