【发布时间】:2010-10-04 20:07:33
【问题描述】:
我在我的 Expert F# 副本第 379 页上注意到以下评论:
传递和处理消息
通常在 共享内存并发和消息 传递并发。前者是 通常在本地机器上效率更高 并在“使用 共享内存并发”稍后在 这一章。后者扩展到 没有共享的系统 内存,例如,分布式 系统,也可以用来避免 与相关的性能问题 共享内存。
我对没有共享内存的进程之间的消息传递并发感兴趣。 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 进程?如果可以,能否提供样本?
【问题讨论】:
标签: concurrency f# erlang