Erlang和Go并发编程,CSP和Actor之间的客观差异?


19

我当时正在研究使用Erlang和Go编程语言进行的并发编程。根据我的发现,它们分别用于Actor模型和CSP。

但是,我仍然对CSP和Actor的客观区别感到困惑吗?只是理论上不同但概念相同?


好吧,它们不一样,因为Go提供了与Erlang不同的原语集。另外,Go的级别比Erlang和类似C的级别低很多。
Daniel Gratzer 2013年

关于程序员接下来应该使用哪种语言,技术或项目的问题不在程序员的话题之列,因为它们只能吸引主观意见。问题背后有太多个人因素,无法产生具有持久价值的答案。推荐阅读:大猩猩VS鲨鱼
蚊蚋

3
@gnat我不同意,这是在问CSP与Actor之间的客观差异。这是一个完全合理的问题
Daniel Gratzer 2013年

2
这个问题不是关于好坏,而是要确定的差异,因此,这个问题是具体的,不是引起主观辩论的原因。
nish1013

1
有一个非常好的答案,在CS理论StackExchange这样一个问题:什么是并发和通信顺序进程的演员模式的区别
约尔格W¯¯米塔格

Answers:


21

在实践中,几乎没有什么区别:两者都代表独立的执行单元,它们与外界的主要接口是通过消息。

区别在于语言的实现细节。以下是一些此类详细信息:

  • 输入Go中的频道;如果要发送带有不同数据的消息,则需要单独的渠道。使用Erlang,可以receive将所有内容发送到流程,并且必须进行模式匹配(在Go中,您将select在多种情况下使用a ,因此代码看起来非常相似,只是使用不同的通道)。
  • 任何人都可以读写Go频道。在Erlang中,任何人都可以发送到进程,但是只有该进程会收到。如果要在多个工作人员之间划分任务,这很重要:在Erlang中,您需要创建一个分发过程,而Go可以简单地共享一个频道。
  • Erlang提供(主要)透明的路径来在多个主机/ VM上分发进程。Goroutine仅限于单个进程(尽管有用于分发的库)。
  • 错误处理是非常不同的。Erlang将每个进程都视为独立的进程:一个进程中的错误(例如,被0除)不会影响任何其他进程,除非您明确链接它们(尽管挂起死进程等待消息的内容会挂起)。Goroutine都在同一进程空间中运行;除以零将删除整个程序。
  • 在Erlang中,数据是不可变的。这意味着流程与外界之间的所有通信都是通过消息进行的。Go允许您在goroutine之间共享状态(尽管您不应该这样做)。

我认为,最后一点是最重要的。两者都使用消息作为主要的通信手段,而Erlang则对状态如何更改以及何时更改提供了更有力的保证。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.