理解Erlang进程

来源:互联网 发布:两个淘宝店用一个网络 编辑:程序博客网 时间:2024/05/17 23:59

对于一种编程语言,除去具体的语法部分(在写程序是可以参考手册),在头脑中形成它运行时的数据对象描述方式和交互方式,是真正理解它的关键所在。Erlang Process正如在教程和文档中描述的,是erlang语言非常重要的对象,本文将从各个方面描述一下对于erlang进程的理解。

主动对象

“主动对象”这种设计模式我最早是在ACE中接触到的,在ACE中通过ACE_Task实现。ACE_Task本身运行于一个OS线程上,通过自己的消息队列与外部对象进行交互。虽然C++在内存访问上没有限制,但是一般ACE_Task内部所管理的数据都不会允许外部直接访问,所以也就成为了本线程私有的数据。ACE_Task会阻塞到消息队列的接受,等待外部的消息,对数据进行处理。

Erlang process基本上与ACE_Task一样,只不过不是运行于线程,而是运行于由erlang VM在用户态调度的虚拟进程。由于erlang process比线程轻量很多,所以可以同时创建出成千上万的erlang process,每个都主动的进行运算,从而形成erlang并行计算的基础。一般会把一个erlang process需要处理的数据当作这个process function的参数传递给这个process,当作个process私有数据处理。

容错单位

实现可容错系统也是使用erlang的一个重要目的。其实整体来看,实现容错处理的基础也是erlang process。拿C++举例,由于一个OS进程中数据访问时没有限制的,各个模块的依赖性很强,所以如果程序运行时出现了致命错误(比如非法指针访问)一般来说很难进行恢复,会导致整个进程挂掉。而erlang process是erlang运行的基本单位,所有的运行错误都会发生在一个具体的erlang process中。由于Erlang process相互之间没有数据共享或直接的数据引用,所以一个erlang process挂掉,不会影响到其他的erlang process。Mnesia可以被实现为一个高效的本地数据库的原因也在于此:Mnesia虽然与其他的erlang process在一个OS进程中,但是不用担心其他erlang process的挂掉会影响到Mnesia。


原创粉丝点击