我在第 379 页的 Expert F# 副本中注意到以下评论:
传递和处理消息
共享内存并发和消息传递并发之间经常存在区别 。前者在本地机器上通常更有效,本章后面的“使用共享内存并发”部分会介绍。后者适用于没有共享内存的系统,例如分布式系统,也可用于避免与共享内存相关的性能问题。
我对没有共享内存的进程之间的消息传递并发感兴趣。Expert F# 中的所有示例以及 Internet 上演示如何使用 MailboxProcessor 的所有示例都包含此代码的一些变体:
let counter =
MailboxProcessor.Start(fun inbox ->
let rec loop n =
async {
do printfn "n = %d, waiting... " n
let! msg = inbox.Receive()
match msg with
| -1 ->
do printfn "'Til the bitter end..."
return ()
| n -> return! loop(n + msg)
}
loop 0)
counter.Post(20)
counter.Post(50)
counter.Post(-1) // kill mailbox
换句话说,您必须先在共享内存中处理 MailboxProcessor,然后才能将消息发布到其通道。据我所知,这不是 Erlang 风格的并发,因为您只能在同一进程中将消息发布到 MailboxProcessors(注意:进程,而不是线程)。
一个进程中的一个 MailboxProcessor 是否可以将消息发送到另一个 MailboxProcessor 进程?如果是这样,你能提供一个样本吗?