例如:
myFunction()
receive
msg1 -> io:format("Message 1!~n"),
self() ! msg1,
myFunction();
msg2 -> io:format("Message 2!~n")
end.
我学会了像msg1这样的消息;但是最近我犯了一个错误,并编译了类似于msg2的代码。当msg2发生时,之后会发生什么?msg2之后,该进程是否只是位于同一接收方并等待其他消息?
如果您没有在接收块的末尾再次调用该函数,则该过程将终止。(如果发生这种情况,则发送msg2
给该过程),但是如果发送其他消息(msg1
和除外msg2
),则该过程将终止。等待,消息将存储在进程的消息队列中。
-module(wy).
-compile(export_all).
myFunction() ->
receive
msg1 ->
io:format("Message 1!~n"),
self() ! msg1,
myFunction();
msg2 ->
io:format("Message 2!~n")
end.
parent() ->
Pid = spawn(fun myFunction/0),
register(myFunction, Pid),
erlang:monitor(process, Pid),
receive
Res -> io:format("Receive ~p~n", [Res])
end.
main() ->
spawn(fun() -> parent() end).
首先你需要执行 wy:main().
(1)如果执行myFunction ! msg22.
,则可以发现进程myFunction
仍然存在,并使用此命令erlang:process_info(whereis(myFunction), messages).
,可以找到消息msg22
存储在消息队列中。
(2)如果执行myFunction ! msg2.
,则可以得到此输出
Message 2!
Receive {'DOWN',#Ref<0.0.0.108>,process,<0.48.0>,normal}
msg2
从此输出中,您可以知道该进程myFunction
已终止。
(3)如果执行myFunction ! msg1
,进程将陷入无限循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句