嗨,我是Erlang的新手,我刚开始学习流程。这里我有一个典型的流程循环:
loop(X,Y,Z) ->
receive
{do} ->
NewX = X+1,
NewY = Y+1,
NewZ = Z+1,
Product = NewX * NewY * NewZ,
% do something
loop(NewX,NewY,NewZ)
end.
如何从函数Product
获取get_product()
的最新值?我知道消息传递将是逻辑选项,但是有更优化的方法来提取值吗?
答案 0 :(得分:2)
我假设这就是你想要的:
-module(lab).
-compile(export_all).
start() ->
InitialState = {1,1,1},
Pid = spawn(?MODULE, loop, [InitialState]),
register(server, Pid).
loop(State) ->
{X, Y, Z} = State,
receive
tick ->
NewX = X+1,
NewY = Y+1,
NewZ = Z+1,
NewState = {NewX, NewY, NewZ},
loop(NewState);
{get_product, From} ->
Product = X * Y * Z,
From ! Product,
loop(State);
_ ->
io:format("Unknown message received.~n"),
loop(State)
end.
get_product() ->
server ! {get_product, self()},
receive
Product ->
Product
end.
tick() ->
server ! tick.
从Erlang shell中:
1> c(lab).
{ok,lab}
2> lab:start().
true
3> lab:get_product().
1
4> lab:tick().
tick
5> lab:get_product().
8
6> lab:tick().
tick
7> lab:tick().
tick
8> lab:get_product().
64
答案 1 :(得分:2)
以下是我所知道的Erlang进程之间的通信方法,以及我(可能是错误的)对其相对性能的评估。
receive
中的模式匹配没有任何开销。erlang:process_info(Pid, dictionary)
调用获取另一个流程词典,在Pid
流程中,您可以使用put(Key, Value)
调用将值放入该词典中。 此外,如果您想加快Erlang应用程序的速度,请查看HiPE,这可能有所帮助。
在从消息传递切换到此列表中的任何内容之前,您应该首先测量!