gpt4 book ai didi

f# - F# Async.Parallel 结果是否保证有序?

转载 作者:行者123 更新时间:2023-12-04 10:38:20 25 4
gpt4 key购买 nike

F# 的 Async.Parallel 操作的结果是否保证按作业提交的顺序到达?我的示例代码按顺序返回结果,但我在 MSDN 文档或 F# 规范中找不到任何提及,确保此 必须是这样的——这不是巧合。

这是我的示例代码:

let r = System.Random()
Async.Parallel [
for i in 0..10 ->
async {
let rand_num = r.Next(10)
do! Async.Sleep(rand_num) (* Simulate jobs taking a variable amount of time *)
printfn "%i %i" i rand_num
return i
}
]
|> Async.RunSynchronously
|> printfn "%A"

这是输出。
0 0
5 1
4 1
3 3
10 6
9 4
7 5
2 5
1 5
8 7
6 9
[|0; 1; 2; 3; 4; 5; 6; 7; 8; 9; 10|]

您可以看到,在这次运行中,异步函数以不确定的顺序完成,但结果数组已排序。这种行为有保证吗?

最佳答案

目前,函数的源代码已写入,以便强制执行此保证。看着 control.fs around line #1300对于定义,我们可以看到将结果放入输出数组的函数是

let recordSuccess i res = 
results.[i] <- res;
finishTask(Interlocked.Decrement count)

这个函数在这个段中被调用
 tasks |> Array.iteri (fun i p ->
queueAsync
innerCTS.Token
// on success, record the result
(fun res -> recordSuccess i res)

哪里 tasks具有按排序顺序的原始任务。这保证了输出列表与输入的顺序相同。

更新

规范至少似乎暗示订单是固定的 - 它包含以下代码:
let rec fib x = if x < 2 then 1 else fib(x-1) + fib(x-2)

let fibs =
Async.Parallel [ for i in 0..40 -> async { return fib(i) } ]
|> Async.RunSynchronously

printfn "The Fibonacci numbers are %A" fibs //I changed this line to be accurate

System.Console.ReadKey(true)

如果规范不保证输出顺序,则此代码将不正确。

关于f# - F# Async.Parallel 结果是否保证有序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24235564/

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