Erlang接收和之后

ghhkc1vu  于 2022-12-20  发布在  Erlang
关注(0)|答案(1)|浏览(201)
p(M, C, B, I) when B =:= 32#3J ->
    receive {_} -> a
    after 27#5C ->
        C ! { self(), { M, (B * 13#37) rem 35#7B, I }} end;

这是一段需要输入的代码,我知道它需要看起来像(num,num,115,num)才能传递第一部分,但是我不明白在receiveafter之后会发生什么,有人能解释一下吗?
我试着阅读erlang的文档,但就是看不懂那部分代码。

flvtvl50

flvtvl501#

下面是一个receive表达式:

receive
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
after
    ExprT ->
        BodyT
end

在erlang中,receive等待消息发送到执行receive的进程。消息必须匹配Pattern(在本例中为{_}),才能执行匹配子句的Body(否则接收方无限期地等待匹配消息)项{_}匹配由元组{}组成的任何消息,其中元组内具有单个项,_。符号_匹配任何内容,因此元组可以包含嵌套元组、列表、字符串、数字...任何内容。因此,元组{[1,a,"hello"]}将匹配,但元组{a, 2}不匹配。
receive..after的工作方式与receive完全相同,只是如果在ExprT毫秒内没有匹配的消息到达,则改为计算BodyT。
下面是您的代码:

p(M, C, B, I) when B =:= 32#3J -> 
    receive 
        {_} -> 
            a 
    after 27#5C -> 
        C ! { self(), { M, (B * 13#37) rem 35#7B, I }} 
end;

整数可以用以下格式表示:base #值,并且27#5C与十进制数147相同。
在此行中:

C ! { self(), { M, (B * 13#37) rem 35#7B, I }}

变量C将包含一个进程标识符,在Erlang中称为"pid",运算符!向左侧指定的进程发送一条消息。右侧是发送给进程C的消息,在本例中,该消息是一个元组,包含当前进程标识符self()作为第一项,另一元组作为第二项。
您的代码由一个包含receive语句的函数组成,其中receive有一个147毫秒的超时,在receive行执行之后,如果当前进程邮箱中有一条消息与{_}匹配,或者如果进程在接下来的147毫秒内收到一条与{_}匹配的消息,则该函数返回原子a。否则,函数将向另一个进程发送消息并返回相同的消息--因为!返回的是右边的值。
在erlang中,您可以在一台基本的笔记本电脑上轻松地启动一百万个进程,这些进程可以相互发送消息,也可以接收特定的消息并执行代码来响应这些消息。

相关问题