F#使用Async.Parallel并行运行2个任务

Jon*_*ats 11 f# asynchronous

假设我有这两个功能:

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

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

我如何使用Async.Parallel同时运行它们并在继续之前等待两者完成?

Mis*_*hor 29

如前所述,您只需将异步函数放入序列中并将其传递给Async.Parallel.

但是,如果您需要执行返回不同类型结果的不同作业,您可以使用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"
Run Code Online (Sandbox Code Playgroud)

  • 如果不是你选择的答案,我不在乎,对我来说,你是真正的mvp (2认同)
  • 我同意,我一直试图弄清楚如何做到这一点,这个例子正是我所寻找的! (2认同)

gra*_*bot 13

Async.Parallel采取一系列异步.在这种情况下,我传递一个列表.

[dowork 1; work 2]
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
Run Code Online (Sandbox Code Playgroud)

如果要返回不同类型的数据,请使用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"
Run Code Online (Sandbox Code Playgroud)

产量

work 1
work finished 2
[|DoWork 1; Work 0.5f|]
Run Code Online (Sandbox Code Playgroud)