I risultati dell'operazione Async.Parallel di F # sono garantiti per arrivare nell'ordine in cui sono stati inoltrati i lavori? Il mio codice di esempio restituisce i risultati in ordine, ma non riesco a trovare alcuna menzione nei documenti MSDN o nella specifica F #, assicurando che questo deve essere il - che non è una coincidenza.I risultati F # Async.Parallel sono garantiti in ordine?
Ecco il mio codice di esempio:
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"
Ed ecco l'output.
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|]
Si può vedere che, in questo periodo, le funzioni asincrone complete al fine indeterminata, eppure la matrice risultante è ordinato. Questo comportamento è garantito?
Questo mi ricorda il fatto che il metodo 'GetHashCode' di un intero restituisce semplicemente l'intero. È un dettaglio di implementazione, al contrario di un requisito di specifica. Consiglierei di non dipendere da questo comportamento. –
@ChristopherStevenson - Ho fatto qualche ricerca e la specifica sembra implicare almeno che l'ordine di uscita è garantito –