首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MailboxProcessor只是复制了IObservable吗?

MailboxProcessor只是复制了IObservable吗?
EN

Stack Overflow用户
提问于 2016-04-08 21:20:58
回答 1查看 183关注 0票数 3

我想处理消息的类型。

Add x使程序记住数字x

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

我为什么要写这个:

代码语言:javascript
复制
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

而不是这样:

代码语言:javascript
复制
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有什么好处吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-09 12:47:25

不,它们不是彼此的复制品。MailboxProcessorIObservable是计算-参与者模型和函数反应编程两种不同模型的底层构建块。

两者都处理异步性,但都强调different qualities。正如您在简单示例中所注意到的,您可能会根据其中一个或另一个构建解决方案,但您会发现其中一个更适合在特定的上下文中使用。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36509538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档