我想知道是否有可能让子进程继续正常操作,直到它从父进程收到“die”消息。
这是子进程的代码。
-module(sensor).
-export([start/1]). % must also export function that will be spawned
%% create second thread, pass self() as argument so it knows how to reply
%% exchange messages with second thread until sum=0
start(SlaveNr) ->
%this part is not right. It waits for die and does nothing else
receive
die ->
io:format("slave ~p: received die~n", [SlaveNr])
end,
random:seed(now()),
Measurement = random:uniform(11),
if Measurement == 11 ->
exit(crash);
true->
io:fwrite("slave ~p Random # ~p~n",[SlaveNr, Measurement])
end,
Sleep_time = random:uniform(10000),
timer:sleep(Sleep_time),
start(SlaveNr).
如您所见,它没有正常执行。它只是等到它收到一个骰子消息。那么我怎么能让它执行它的正常函数,直到它从父节点收到一个骰子,指示所有子进程应该退出?
答案 0 :(得分:1)
据我所知,您想在每个循环中检查邮箱,您可以通过添加0 ms的时间来实现此目的。因此,该过程将检查是否有任何收到的消息与死亡匹配,如果不匹配则会立即继续。
receive
die ->
io:format("slave ~p: received die~n", [SlaveNr])
after 0 ->
ok
end,
始终可以使用exit/2
函数停止流程:exit(Pid,Reason)
。在这种情况下,您不必在传感器模块中添加任何代码。如果你使用原子normal
作为Reason
,那么这个过程将完全死亡,就好像它自己正常死亡一样。