Erlang 并发编程基础之一

Posted IT萌新

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Erlang 并发编程基础之一相关的知识,希望对你有一定的参考价值。

Erlang 并发编程的基础语法主要有以下三点:

1.发送消息

Pid ! Message

该语句实现的功能是向Pid进程发送消息Message,Pid为新进程的进程标识符。

2.接收消息

receive    Pattern1 [when Guard1] -> Exp1;    Pattern2 [when Guard2] -> Exp2;    ... after Time -> Exp_after end

当进程的邮箱中消息来到时,依次用Pattern1、Pattern2进行模式匹配,成功则执行其后的表达式。after表示当等待消息时间超过Time时,会对其后的Exp_after求值。如果不需要处理超时的话,after语句可以不用写。

对于接收消息的进程,凡是没有成功得到匹配的会一直放在该进程的邮箱中,程序员应保证其不被填满。

3.创建进程

创建进程是通过调用Erlang 提供的函数spawn实现的,其形式主要有以下两种:

(1)Pid = spawn(Fun)

创建一个进程,并在新进程中对Fun求值,同时返回新进程的Pid。

(2)Pid = spawn(M,F,A)

创建一个进程,并在新进程中对模块M中的F求值,并为F提供参数A(通过将参数放入一个列表中传入),同时返回新进程的Pid。

此外,为了方便对进程的引用,还可以使用Erlang 语言提供的函数将进程注册一个名字。

register(name,Pid)

将Pid进程名注册为name,便于另一进程的引用。

使用以上介绍的原语,我们可以写出一个简单的实例,其源代码如下:

%filename: concur.erl -module(concur). -compile(export_all).
%以下定义进行单位转换的函数 convert({cm,X}) -> X/100; convert({dm,X}) -> X/10.
%以下定义服务进程函数 serv_proc() ->
    %接收消息
    receive   
        %匹配消息并作相应的处理后发回消息的发送者
        {From,{cm,X}} -> From!convert({cm,X});        {From,{dm,X}} -> From!convert({dm,X});        {From,Other} -> io:format("~w~n",[Other]),From!"Error"    end,    serv_proc().                %递归调用,循环执行服务函数
%创建新进程,返回新进程的Pid start_serv() ->    spawn(fun serv_proc/0).
%客户端函数 client(Pid,X) ->    Pid!{self(),X},      %给服务器发送要处理的消息,self()获取本进程的Pid    receive        Message -> Message  %接收服务器发回的消息,并作为函数的返回值    end.

其在交互式环境下调用和运行结果如下图:


第3行语句调用concur模块中的start_serv/0 函数创建新进程(模拟服务器进程),并返回新进程的Pid。

第4行语句调用concur模块中的client/2 函数向刚才新建的进程发送消息(包括本进程的Pid和需要服务进程处理的消息),并接收服务器发来的处理结果。


以上是关于Erlang 并发编程基础之一的主要内容,如果未能解决你的问题,请参考以下文章

无线院西安Erlang基础和递归编程设计训练营第一期报名啦

如何等待用户的输入并继续进行erlang并发编程中的进一步代码?

Erlang 并发编程

Erlang基础之整数

Java并发编程系列之一并发理论基础

Erlang 并发编程