并发是容易的

我们了解并发。

对并发的深入理解已经深植于我们的大脑。我们对刺激的反应非常迅速,这由大脑的被称为杏仁核的一部分负责,没有这个反应系统我们可能会死掉。有意识的想法太慢了,当“刹车”的想法形成的时候,我们已经那么做完了。

在高速公路,我潜意识地判断几十或数百辆汽车的位置,这样做是没有经过有意识的思考的。如果我不能这样做,我可能会死掉。

世界是并行的

如果我们想写的程序的行为和真实世界里事物的行为一样,那么这些程序将有一个并发的结构。

这就是为什么我们应该用并发的编程语言编程

然而,大多数情况下,我们用顺序的编程语言编程现实世界的应用程序。这肯定很困难。

用被设计为编写并发应用程序的语言(比如Erlang)来编程,那么并发编程会变得容易很多。

Erlang程序模型,我们如何思考和交互

我们没有共享记忆。我有我的记忆,你有你的记忆,我们俩一共有两个大脑,彼此独立,它们不连在一起。为了要改变你的记忆,通过说话或挥动我的手臂的方式我发一个消息给你。你听到或看到,然后你的记忆改变了。但是如果我不问你或者不观察你的反应,我就不知道你是否收到了我发给你的消息。

Erlang进程也是如此。Erlang进程没有共享内存。每个进程有它自己的内存。为了改变其他进程的内存,你必须发送消息给它们并希望它们收到而且理解你发的消息的意思。

为了确认其他进程收到你的消息并改变了它的内存,你必须问它们(通过发送一条消息)。这正是我们人类如何彼此交互的方式。

苏:“嗨,比尔,我的电话号码是45 67 89 12”。

苏:“你听见了吗?”。

比尔:“收到,你的电话号码是45 67 89 12”。

这些互动模式对于我们来说非常熟悉,从出生开始,我们通过观察外部世界,并且通过发送信息给外部世界同时通过观察外部世界的反馈来学习与外部世界交互。

人们作为独立实体通过发送消息进行交互

这就是Erlang进程的工作方式,也是我们的工作方式,所以我们可以非常容易理解Erlang程序。

Erlang程序由许多小进程组成,这些进程之间总在喋喋不休的交流,就像我们人类。

一个Erlang程序由数十,可能数千,甚至数十万小进程组成。所有这些进程独立地运行。它们彼此通过发送消息来交流。每个进程有自己的私有内存。它们的行为就像一座大房子里的人们一样彼此通过聊天来交流。

这使得Erlang程序天生就容易管理和扩展。假设我们有十个人(进程),他们有太多的工作要做,我们该如何处理?答案就是让更多的人来做。我们怎么管理这些人?简单地朝他们喊指令就行(广播)。

Erlang进程没有共享内存,所以当一块内存被使用的时候就没必要给它上锁。有锁就需要钥匙,只要有锁,就有可能某天会丢失钥匙。当你丢了钥匙,会怎么样?你会惊慌失措。

有锁和钥匙的分布式软件系统总是出错。

如果有人死了,其他人会注意到

我在一个房间里,突然倒下死了,别人可能会注意到,至少我希望是如此。Erlang进程和我们人是一样的,他们有时也会死。不像人们死去时那样,Erlang进程在它们最后一口气的时候会大声喊出他们到底死于什么。

想象一个有很多人的房间,突然一个人倒下并死掉。就在他死亡的一刻,他说,“我死于心脏病”,或者,“我死于胃出血”。这就是Erlang进程的做法。一个进程死的时候可能会说:“我死于被要求被零除”,另一个进程死的时候可能会说:“我死于被要求查询空列表的最后一个元素是什么”。

现在在我们这个很多人的房间里,我们可以想象有一些人被特别地赋予清理尸体的特殊工作。假设有两个人,简和约翰。如果简死了,约翰会处理简的后事。如果约翰死了,简会处理约翰的后事。简和约翰被一个看不见的约定联系在一起,只要他们中的一个死亡,另一个就会处理后事。

这就是Erlang的错误发现机制,进程可以被链接在一起。如果其中一个进程死掉,其他进程会获得一个错误消息,这个消息告诉他们死亡进程的死亡原因。

基本上就是这样的。

这就是Erlang程序的工作机制。

到目前为止我们学到了什么

Erlang程序由许多进程组成。这些进程彼此之间可以发送消息。这些消息可能会或可能不会被接收和理解。如果你想知道消息是否被接收和理解,你必须给进程发送一条消息并等待回复。

进程可以被链接在一起。如果链接中的一个进程死掉,其他的进程会被发送一条包含这个进程为什么死掉的消息。

这个简单的编程模型是被我称为面向并发编程模型的一部分。你可以在这里参阅更多信息。

原文链接: http://armstrongonsoftware.blogspot.com.ar/2006/08/concurrency-is-easy.html