Erlang(2):初步接触并发的编程思想
看了《Erlang程序设计》的开头两章,觉得跟第一版的果然很不同。而且是正版的电子版,文字版的,不是图片。
Erlang是面向并发的语言,它可以创建数以万计的进程来执行程序。
当然这些进程是由Erlang虚拟机管理的轻量级进程,而不是操作系统的进程。
对照C++,Java这些面向对象的语言来看。
Erlang的进程更加像类的对象。
通过声明模块,在别的模块里面就可以创建这些模块:
-module(moduleName). 包含moduleName模块,模块名必须以小写字母开头。
erlang文件以.erl结尾
.作为语句的结尾
模块名是一个原子。
在各自的模块里面,函数默认是私有的,要声明export才能再外部引用。
-export([fun1/n1, fun2/n2, ....]).
导出声明,指出模块里哪些函数可以从模块外部进行调用,类似与C++的public声明。
导出多个函数,fun1为函数名,n1为参数个数。
进程之间是不共享数据的,所以不需要担心在C++里面出现的死锁之类的东西。其实我都没怎么接触过C++的多进程。
进程之间的通信,要通过发送消息来执行。
spawn(ModName, FuncName, [Arg1, Arg2, ..., ArgN])
spawn是erlang基本函数,创建一个并发进程,并返回一个进程标识符。
不是创建系统进程,而是创建的是Erlang系统管理的轻量级进程。
模块类似于C++的类。
进程则类似于C++的对象。
Pid ! Msg 发送消息Msg到进程Pid。
接收消息
receive
{From, Message} ->
...
Erlang是面向并发的语言,它可以创建数以万计的进程来执行程序。
当然这些进程是由Erlang虚拟机管理的轻量级进程,而不是操作系统的进程。
对照C++,Java这些面向对象的语言来看。
Erlang的进程更加像类的对象。
通过声明模块,在别的模块里面就可以创建这些模块:
-module(moduleName). 包含moduleName模块,模块名必须以小写字母开头。
erlang文件以.erl结尾
.作为语句的结尾
模块名是一个原子。
在各自的模块里面,函数默认是私有的,要声明export才能再外部引用。
-export([fun1/n1, fun2/n2, ....]).
导出声明,指出模块里哪些函数可以从模块外部进行调用,类似与C++的public声明。
导出多个函数,fun1为函数名,n1为参数个数。
进程之间是不共享数据的,所以不需要担心在C++里面出现的死锁之类的东西。其实我都没怎么接触过C++的多进程。
进程之间的通信,要通过发送消息来执行。
spawn(ModName, FuncName, [Arg1, Arg2, ..., ArgN])
spawn是erlang基本函数,创建一个并发进程,并返回一个进程标识符。
不是创建系统进程,而是创建的是Erlang系统管理的轻量级进程。
模块类似于C++的类。
进程则类似于C++的对象。
Pid ! Msg 发送消息Msg到进程Pid。
接收消息
receive
{From, Message} ->
...
end
在这里可以想象得到,程序应该会比C++慢很多很多,如果是在一个单核的计算机上面。
因为没有C++那种函数调用,引用传递,指针传递。几乎每一个函数调用,都是进程之间的通信。
而且数据不能共享,导致很多地方要信息不停打包,复制。
所以要充分发挥多核应用的优势,才能摆脱这种劣势。
不过设计思想果然很新颖。
人生如戏,还是戏如人生?微信公众号:传说之路
csdn博客 http://blog.csdn.net/u012175089/article/list/2