Concurrency 分布式系统中的邮箱处理器

Concurrency 分布式系统中的邮箱处理器,concurrency,f#,erlang,Concurrency,F#,Erlang,我在379页的专家F#副本中注意到以下评论: 传递和处理消息 两者之间通常有区别 共享内存并发和消息 传递并发性。前者是 在本地机器上通常效率更高 并在“使用”一节中介绍 “共享内存并发性”将在后面介绍 这一章。后者可扩展到 没有共享资源的系统 例如,内存是分布式的 系统,也可以用来避免 与相关的性能问题 共享内存 我感兴趣的是没有共享内存的进程之间的消息传递并发性。Expert F#和internet上演示如何使用MailboxProcessor的所有示例都包含此代码的一些变体: let co

我在379页的专家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进程发送消息?如果是这样,你能提供一个例子吗?

我想你对术语有点困惑。Erlang进程不一定直接对应于OS进程。一个给定的OS进程可以有多个Erlang进程(通常是这样),就像您的进程有多个线程一样。如果要在多个操作系统进程之间通信,可能需要签出。可以想象,可以围绕这些API创建一个MailboxProcessor风格的包装器。

MailboxProcessor和AsyncReplyChannel不提供与Erlang中的“pid bang”(pid!)操作相同的位置透明度。当然,这仅在正确配置分布式Erlang节点(即名称、DNS、同步模块、Cookie等)时起作用。OTP中有一些功能可以简化此管理。当然,如果Erlang进程在同一个节点上,它就可以工作。但是,分布式Erlang存在一些缺陷

“网络是安全的。” 内置的分布式Erlang机制假定网络是安全的。因此,在需要安全性时,使用基于套接字的代理Erlang进程通信方法

“网络是可靠的。” 分布式Erlang的工作原理之一是它的错误处理原理,即进程是不可靠的,因此只有通过通信进程监视器才能实现容错。OTP编纂模式(即主管)以实现这一理念。Erlang中的可靠消息传递可以通过Mnesia(一个分布式数据库)实现,就像RabbitMQ中所做的那样,但您无法直接使用它

最后,分布式通信从来没有这么容易。我们可以在F#中实现一个AsynchWorker作为我们的代理,并通过AsynchReplyChannel.Send与之通信。我们仍然必须考虑分布式计算的谬误

最后,消息传递式并发并不意味着进程外通信。它确实意味着没有共享状态可以用锁来管理,因此是一个更简单、更不容易出错的并行计算模型。我认为这是这种并发方式的一个很好的例子。F#示例在美观上不如Squeak或Erlang实现,因为缺少用于消息传递的内置语法,但它可以工作。

也许这样就可以了

我没有得到太多的反馈,所以不确定它是否100%正确。如果你觉得不好,请告诉我

谢谢!