Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous F#使用Async.Parallel并行运行两个任务_Asynchronous_F# - Fatal编程技术网

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

Asynchronous F#使用Async.Parallel并行运行两个任务,asynchronous,f#,Asynchronous,F#,假设我有这两个功能: let dowork n = async { do printfn "work %d" n } let work i = async { do! Async.Sleep(2000) printfn "work finished %d" i } 如何使用Async.Parallel并发运行它们,并在继续之前等待两者完成?Async.Parallel采用一系列Async。在这种情况下,我会给它一个列表 [dowork 1; work

假设我有这两个功能:

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

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

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

Async.Parallel
采用一系列Async。在这种情况下,我会给它一个列表

[dowork 1; work 2]
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
如果要返回不同类型的数据,请使用

输出

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

如前所述,您只需按顺序放置异步函数,并将它们传递给
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"

当任务的数量在编译时固定时,我希望有这样一个助手函数:

模块异步=
设2 a b=
异步的{
//启动这两项任务
设!x=Async.StartChild a
让!y=Async.StartChild b
//等待两者都完成
设!i=x
让!j=y
//以强类型元组的形式返回两个结果
返回i,j
}
用法如下:

let work1=async{return 1}
让work2=async{返回“a”}
让工作1和2=
异步的{
让!(a,b)=异步并行2工作1工作2
打印fn“%i%s”a b
}
请注意任务的类型是如何不同的。这可能非常有用

我们可以为
Async
添加额外的帮助程序,因为
()
((),())
具有相同的语义:

模块异步=
// ...
让doParallel2(a:Async)(b:Async)=
平行线2 a b
|>异步。忽略
然后应用于您的场景:

async{
do!Async.doParallel2(工作1)(工作2)
}

可能的重复,我不在乎你的答案是否不是选定的答案,对我来说,你才是真正的mvpI同意,我一直在试图找出如何做到这一点,而这个例子正是我想要的!
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"