erlang杂记三 ---- 进程

来源:互联网 发布:淘宝产品摄影布光技巧 编辑:程序博客网 时间:2024/05/21 17:03

1.特性:在erlang里,进程属于语言特性而非操作系统。

创建和销毁进程非常迅速;在两个进程之间收发消息非常迅捷;进程在所有操作系统上行为相同,可以创建大量进程;进程之间不共享任何数据,彼此完全独立;进程间交互的唯一方法是通过消息传递的。

2.并发原语:Pid=spawn(Fun)创建一个进程,用于对Fun求职。新进程与调用者并发运行。

Pid ! Message 向Pid发送Message,P1!P2!P3...!M将M发送到P1,P2...

receive ... end 接收一个发给当前进程的消息。收到消息时会与pattern逐个进行匹配,匹配不到则继续等待吓一跳消息。

after 在receive中作为等待超时信息。

3.注册进程:

如果想要给一个进程发送消息,那么就需要知道他的pid,这种方法很麻烦,这意味着系统做所有发送消息的进程都知道这个pid,也就是说,如果你不公开这个pid,那么就无法与该进程进行通信。解决办法就是register该pid到一个名字。

4.如何编写一个并发程序:

-module(ctemplate).-compile(export_all).start()->spawn(fun()->loop([]) end).rpc(Pid,Request)->      Pid!{self(),Response},      Response      end.loop(X)->     receive           Any->               do_sth,               loop()      end.

5.使用MFA启动进程:

spawn(Mod,FuncName, Args)该方式可用于动态升级代码。。

6.体验通信:

  1 -module(ping_pong).  2 -export([start/1,ping/3,pong/0]).  3  4 start(N)    ->  5     PongId2=spawn(ping_pong, pong,[]),  6     PongId=spawn(ping_pong, pong,[]),  7     spawn(ping_pong, ping,[N,PongId,PongId2]).  8  9 ping(0,PongId,PongId2)  -> 10     PongId ! {self(), finish}, 11     PongId2 ! {self(), finish}, 12     io:format("ping finished~n",[]); 13 ping(N,PongId,PongId2)  -> 14     PongId ! {self(), run}, 15     PongId2 ! {self(), run}, 16     receive 17         {PongId,run}    -> 18             io:format("ping receive from pong1~n",[]); 19         {PongId2,run}   -> 20             io:format("ping receive from pong2~n",[]) 21     end, 22     ping(N-1, PongId,PongId2). 23 24 pong()  -> 25     receive 26         {_,finish}  -> 27             io:format("pong finished~n",[]); 28         {PingId, run}   -> 29             io:format("pong receive from ping~n", []), 30             PingId ! {self(), run}, 31             pong() 32     end.
使用方法:
c(ping_pong).ping_pong:start(5).
发送消息的时候,将自身的id值发送到对方,则对方知道回复消息回复到谁。运用模式匹配可以很好的识别消息。

原创粉丝点击