代码之家  ›  专栏  ›  技术社区  ›  user2136963

MailboxProcessor只是复制IObservable吗?

  •  3
  • user2136963  · 技术社区  · 8 年前

    我想处理消息类型

    Add x 使程序记住数字x

    Print 让它打印所有记住的数字

    我为什么要这样写:

    open System
    type Message =
        | Add of int
        | Print
    let mailbox = new MailboxProcessor<Message>(fun inbox -> 
            let rec loop history = async{
                let! msg=inbox.Receive()
                match msg with
                    | Add x -> return! loop(history + x.ToString()+" ")
                    | Print ->
                        printfn "%s" history
                        return! loop(history)
            }
            loop ""
        )
    [<EntryPoint>]
    let main argv = 
        mailbox.Start()
        mailbox.Post(Add 12)
        mailbox.Post(Add 56)
        mailbox.Post(Print)
        mailbox.Post(Add 34)
        mailbox.Post(Print)
        ignore <| Console.ReadLine()
        0
    

    而不是这样:

    open System
    open System.Reactive.Subjects
    type Message =
        | Add of int
        | Print
    let subject = new Subject<Message>() 
    [<EntryPoint>]
    let main argv = 
        subject
            |> Observable.scan(fun history msg -> 
                    match msg with
                            | Add x -> history + x.ToString()+" "
                            | Print ->
                                printfn "%s" history
                                history
                ) ""
            |> Observable.subscribe(fun _->())
            |> ignore
        subject.OnNext(Add 12)
        subject.OnNext(Add 56)
        subject.OnNext(Print)
        subject.OnNext(Add 34)
        subject.OnNext(Print)
        ignore <| Console.ReadLine()
        0
    

    这个 MailboxProcessor 增加了额外的复杂性。我需要一个状态机,它接受一个状态并返回一个状态。但它迫使我 inbox ,用于接收状态。

    它有什么好处吗 IObservable ?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Community CDub    7 年前

    不,它们不是彼此的复制品。 MailboxProcessor IObservable 是两种不同的计算模型的底层构建块,分别是actor模型和函数式反应式编程。

    两者都处理异步性,但强调 different qualities 。可能可以根据一个或另一个来构建解决方案,正如您在简单示例中所注意到的,但您会发现在特定环境中使用这一个或那个更自然。

    MailboxProcessors 对于线程安全、无锁访问资源(如文件)特别有用。您可以让多个线程通过异步接口操作资源 邮箱处理器 保证一次只处理其中一个请求。