2013-04-05 13 views
8

Zakładając mam te dwie funkcje:F # przy użyciu Async.Parallel do uruchomienia 2 zadania równolegle

let dowork n = 
    async { 
     do printfn "work %d" n 
    } 

let work i = async { 
    do! Async.Sleep(2000) 
    printfn "work finished %d" i } 

Jak użyłbym Async.Parallel uruchomić je równolegle i czekać na zarówno przed przystąpieniem do końca?

+0

Możliwe dups, http://stackoverflow.com/questions/5693279/combining-f- async-functions, http://stackoverflow.com/questions/4106846/how-to-wait-for-async-to-finish – gradbot

Odpowiedz

12

Async.Parallel wykonuje sekwencję asynchroniczną. W tym przypadku przekazuję mu listę.

[dowork 1; work 2] 
|> Async.Parallel 
|> Async.RunSynchronously 
|> ignore 

Jeśli chcesz zwrócić różne typy danych, użyj numeru Discriminated Union.

type WorkResults = 
    | DoWork of int 
    | Work of float32 

let dowork n = 
    async { 
     do printfn "work %d" n 
     return DoWork(n) 
    } 

let work i = async { 
    do! Async.Sleep(2000) 
    printfn "work finished %d" i 
    return Work(float32 i/4.0f) 
} 

[dowork 1; work 2] 
|> Async.Parallel 
|> Async.RunSynchronously 
|> printf "%A" 

wyjście

work 1 
work finished 2 
[|DoWork 1; Work 0.5f|] 
18

Jak wspomniano wcześniej, wystarczy umieścić swoje funkcje async w sekwencji i przekazać je do Async.Parallel.

Ale jeśli trzeba wykonać różne zadania, które zwracają wyniki różnych typów, można użyć Async.StartChild:

let fn1 = async { 
     do! Async.Sleep 1000 
     printfn "fn1 finished!" 
     return 5 
    } 

let fn2 = async { 
     do! Async.Sleep 1500 
     printfn "fn2 finished!" 
     return "a string" 
    } 

let fncombined = async { 
     // start both computations simultaneously 
     let! fn1 = Async.StartChild fn1 
     let! fn2 = Async.StartChild fn2 

     // retrieve results 
     let! result1 = fn1 
     let! result2 = fn2 

     return sprintf "%d, %s" (result1 + 5) (result2.ToUpper()) 
    } 

fncombined 
|> Async.RunSynchronously 
|> printfn "%A" 
+2

Nie obchodzi mnie, czy twoja nie jest wybraną odpowiedzią, dla mnie jesteś prawdziwy mvp –

+2

Zgadzam się, próbowałem dowiedzieć się, jak to zrobić, a ten przykład jest DOKŁADNIE tym, czego szukałem! – Keith

Powiązane problemy