Как использовать 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

1 ответ

Решение

Это ошибка в F# 3.0. Async.Parallel звонки Seq.toArray дважды. Запустите ваш код под F# 3.1, и он будет напечатан только один раз. Вот исправление в репозитории F# source.

Другие вопросы по тегам