erlang并发编程和进程通信
创始人
2024-05-31 20:17:39
0

文章目录

    • 进程
    • 消息传递

进程

erlang的并发编程简单易用而且轻量,只需通过spawn函数调用另一个函数即可,可谓开箱即用。其参数为

spawn(Module, Fucntion, Args) -> pid()

其中Module为模型名;Function为函数名;ArgsFunction的参数。返回值pid()表示进程号。下面写一个脚本

-module(spawnTest).
-export([start/0, say/2]).say(What, 0) ->done;
say(What, Times) ->io:format("~p~n", [What]),say(What, Times - 1).start() ->spawn(spawnTest, say, [hello, 3]),spawn(spawnTest, say, [goodbye, 3]).

编译并执行,结果如下,可见hellogoodbye之间的输出是交替的

1> c("spawnTest").
{ok,spawnTest}
2> spawnTest:start().
hello
goodbye
hello
goodbye
<0.88.0>
hello
goodbye
hello
goodbye

其中<0.88.0>是进程标识符,这个标识符是start函数返回的。所以这个程序看上去只有两个进程,交替打印出sayhello,但实际上,start()也是一个进程,其返回值是最后一行语句,即spawn..goodbye..的返回值。所以从上面的结果来看,两个spawnTest函数执行到一半的时候,start()迎来了生命周期的尾声。

消息传递

一般在编程语言中,线程和进程是两个不同的概念,前者是最小执行单元,可以粗暴地理解为一个函数。一个程序中可以有多个线程,这些线程共用一片内存,只是执行时并不按照调用的顺序,而是并发工作。进程则不然,每个进程都是一个独立运行的程序,拥有自己独有的内存区域,除非用特殊的手段让二者共享,否则彼此不通往来。

而在erlang中,spawn开启的是进程,彼此之间需要通过特殊的手段才能通信,这个特殊手段就是!,erlang进程通信的基本语法为

Pid ! Message

其中Pid为进程的标识符,Message为发送的信息内容。这行代码的整体含义,就是向标识符为Pid的进程发送Message

有发送自然要有接收,erlang接收信息需要一个程序块,基本格式为

receivePattern1 -> ...Pattern2 -> ......
end

其中receive即接收函数,Pattern为被匹配的模式,简单理解就是发送者发送的内容。与普通函数在参数传入后的模式匹配雷同。

下面就实战体验一下

-module(comTest).
-export([start/0, pidA/2, pidB/0]).pidA(0, PID) ->PID ! finished,io:format("A: finished~n", []);pidA(N, PID) ->% self() 返回自身的进程号PID ! {pidA, self()},receive pidB -> io:format("A: received B~n", [])end,pidA(N - 1, PID).pidB() ->receivefinished -> io:format("B: A finished~n", []);{pidA, PID} ->io:format("B: received A~n", []),PID ! pidB,pidB()end.start() ->B_PID = spawn(comTest, pidB, []),spawn(comTest, pidA, [3, B_PID]).

效果如下

1> c(comTest).
{ok,comTest}
2> comTest:start().
B: received A
<0.88.0>
A: received B
B: received A
3> A: received B
3> B: received A
3> A: received B
3> A: finished
3> B: A finished```

相关内容

热门资讯

中证A500ETF摩根(560... 8月22日,截止午间收盘,中证A500ETF摩根(560530)涨1.19%,报1.106元,成交额...
A500ETF易方达(1593... 8月22日,截止午间收盘,A500ETF易方达(159361)涨1.28%,报1.104元,成交额1...
何小鹏斥资约2.5亿港元增持小... 每经记者|孙磊    每经编辑|裴健如 8月21日晚间,小鹏汽车发布公告称,公司联...
中证500ETF基金(1593... 8月22日,截止午间收盘,中证500ETF基金(159337)涨0.94%,报1.509元,成交额2...
中证A500ETF华安(159... 8月22日,截止午间收盘,中证A500ETF华安(159359)涨1.15%,报1.139元,成交额...
科创AIETF(588790)... 8月22日,截止午间收盘,科创AIETF(588790)涨4.83%,报0.760元,成交额6.98...
创业板50ETF嘉实(1593... 8月22日,截止午间收盘,创业板50ETF嘉实(159373)涨2.61%,报1.296元,成交额1...
港股异动丨航空股大幅走低 中国... 港股航空股大幅下跌,其中,中国国航跌近7%表现最弱,中国东方航空跌近5%,中国南方航空跌超3%,美兰...
电网设备ETF(159326)... 8月22日,截止午间收盘,电网设备ETF(159326)跌0.25%,报1.198元,成交额409....
红利ETF国企(530880)... 8月22日,截止午间收盘,红利ETF国企(530880)跌0.67%,报1.034元,成交额29.0...