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 并发编程基础之一的主要内容,如果未能解决你的问题,请参考以下文章