如何在异步工作流中使用 Async.Parallel



我一直在尝试学习如何使用基于异步消息的方法。 以下是我尝试做的简化版本。 我正在尝试在对象的MailboxProcessor中使用有限状态机。 总体而言,与使用基于事件的方法相比,逻辑似乎要简单得多。 当我尝试使用Async.Parallel时,我遇到了一个问题。 在 printfn "Eval %i" v 语句后面的代码中,i1 &i2 被评估两次,而不是每次评估一次。这让我相信我没有正确使用Async.Parallel。是否有应在异步工作流中使用的替代方法?

type Input(v) = 
    let agent = 
        MailboxProcessor.Start(fun inbox -> 
            let rec loop() = 
                async { 
                    let! (msg : AsyncReplyChannel<int>) = inbox.Receive()
                    printfn "Eval %i" v
                    msg.Reply(v)
                    return! loop()
                }
            loop())
    member this.Eval = agent.PostAndAsyncReply(fun r -> r)
let i1 = Input(1)
let i2 = Input(2)
async { 
    let! nodeValues = [ i1; i2 ]
                      |> Seq.map(fun n -> n.Eval)
                      |> Async.Parallel
    return nodeValues
}
|> Async.RunSynchronously

这是 F# 3.0 中的一个错误。 Async.ParallelSeq.toArray打了两次电话。 在 F# 3.1 下运行代码,它只会打印一次。 下面是 F# 源存储库中的修补程序。

相关内容

  • 没有找到相关文章

最新更新