gpt4 book ai didi

f# - MailboxProcessor 只是复制 IObservable 吗?

转载 作者:行者123 更新时间:2023-12-04 02:13:08 25 4
gpt4 key购买 nike

我想处理消息的类型

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 有什么优势吗?

最佳答案

不,它们不是彼此的副本。 MailboxProcessorIObservable 分别是两种不同计算模型(参与者模型和函数式响应式(Reactive)编程)的低级构建 block 。

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

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

关于f# - MailboxProcessor 只是复制 IObservable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36509538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com