2013-04-05 25 views
8

Giả sử tôi có hai chức năng:F # sử dụng Async.Parallel để chạy 2 nhiệm vụ song song

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

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

Làm thế nào tôi sẽ sử dụng Async.Parallel để chạy chúng trùng nhau và đợi cho cả hai để kết thúc trước khi tiếp tục?

+0

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

Trả lời

12

Async.Parallel cần một chuỗi không đồng bộ. Trong trường hợp này, tôi chuyển cho nó một danh sách.

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

Nếu bạn muốn trả về các loại dữ liệu khác nhau, hãy sử dụng 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" 

đầu ra

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

Như đã đề cập trước đó, bạn chỉ cần đặt chức năng async của bạn trong một chuỗi và vượt qua chúng để Async.Parallel.

Nhưng, nếu bạn cần phải thực hiện các công việc khác nhau mà trả về kết quả của các loại khác nhau, bạn có thể sử dụng 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

Tôi không quan tâm nếu bạn không phải là câu trả lời đã chọn, đối với tôi, bạn là real mvp –

+2

Tôi đồng ý, tôi đã cố gắng tìm ra cách để làm điều này và ví dụ này là CHÍNH XÁC những gì tôi đang tìm kiếm! – Keith

Các vấn đề liên quan