erlang被称作纯粹的消息传递语言。在erlang中,和进程打交道只需要3个原语:spawn、 send和receive。
1.关于erlang并发编程的一个例子。
先上代码:
[caption id="attachment_618" align="alignnone" width="300" caption="erlang并发编程"][/caption]
20> c(area_server1.erl).
{ok,area_server1}
21> Pid3 = area_server1:start().
<0.98.0>
22> area_server1:area(Pid3,{rectangle,10,10}).
100
<0.40.0>
代码分析:
第四行,来自并发原语Pid = spawn(Fun),创建一个新进程,对Fun求值。新进程与调用者所在的进程并发运行。spawn返回一个Pid。
第八行,并发原语Pid ! Message,想进程标识符为Pid的进程发送消息。消息发送是异步的,发送者无需等待返回结果就可继续处理自己的事务。
receive ... end 接受一个发给当前进程的消息,进行匹配,如果没有匹配到,消息会留给后续过程来处理,然后进程等待下一条消息。
当输入命令Pid3 = area_server1:start(),创建一个服务端进程。进程执行loop()函数,等待接受消息。
area_server1:area(Pid3,{rectangle,10,10}).输入命令后,将创建一个新进程(客户端进程),到代码第九行,给Pid3发送一条消息,{该客户进程id,{rectangle,10,10}}。然后等待消息返回,等待消息中,匹配模式{Pid,Response}绑定了Pid(这里是Pid3),因为receive...end里只有个匹配模式,所以只有当接受的消息为Pid时,后面的式子才会执行。
给Pid3发送消息后,17-20执行,From为客户端进程id,然后18行像客户端进程发送消息。self()现在为服务端的id,也就是Pid3。然后继续等待消息。
客户端接受消息,11行进行匹配,发现Pid正确,执行后面语句,打印self()(客户端id)。
晚上用零碎时间又修改了一下代码,方便调试。ps:这个代码开始没看懂,借助群里大牛点通了。
[caption id="attachment_620" align="alignnone" width="300" caption="erlang编程2"][/caption]
上一篇: erlang学习笔记--BIF,二进制数据,比特语法
下一篇: 利用pil,cStringIO将图片暂存上传
0 Responses so far.