gpt4 book ai didi

Erlang - Spawn MFA vs Spawn Fun

转载 作者:行者123 更新时间:2023-12-04 02:08:43 27 4
gpt4 key购买 nike

我一直在尝试使用 Programming Erlang,版本 2(Joe Armstrong 的书)。我正在尝试解决第 13 章中的第一个问题。

作为解决问题的办法——我想到了这个——

-module(errorhandle1).
-export([my_spawn/3,loop/1,test_func/0]).

my_spawn(Mod,Fun,Args) ->
%SpawnedPidRef = myspawn_helper(Mod,Fun,Args),
%spawn(?MODULE , loop , [myspawn_helper(Mod,Fun,Args)]).
spawn(fun() -> loop(myspawn_helper(Mod,Fun,Args)) end).

myspawn_helper(Mod,Fun,Args) ->
statistics(wall_clock),
spawn_monitor(Mod,Fun,Args).

loop({SpPid,SpRef}) ->
io:format("Created Pid is : ~p~n",[SpPid]),
receive
{makeError,Msg} ->
SpPid ! Msg,
loop({SpPid,SpRef});
{'DOWN',SpRef, process,SpPid,Why} ->
{_, Time1} = statistics(wall_clock),
io:format("Down"),
io:format("Process spawn time = ~p microsecond ~n",[Time1])
end.

test_func() ->
receive
X ->
list_to_atom(X)
end.

以上代码有效并产生了所需的输出(第一步是解决问题)。然后我评论了这一行并提出了以下程序,它与上面的程序完全相同,但是,我使用 spawn/3 函数而不是 spawn/1 并且我似乎没有得到所需的输出。

-module(errorhandle1).
-export([my_spawn/3,loop/1,test_func/0]).

my_spawn(Mod,Fun,Args) ->
%SpawnedPidRef = myspawn_helper(Mod,Fun,Args),
spawn(?MODULE , loop , [myspawn_helper(Mod,Fun,Args)]).
%spawn(fun() -> loop(myspawn_helper(Mod,Fun,Args)) end).

myspawn_helper(Mod,Fun,Args) ->
statistics(wall_clock),
spawn_monitor(Mod,Fun,Args).

loop({SpPid,SpRef}) ->
io:format("Created Pid is : ~p~n",[SpPid]),
receive
{makeError,Msg} ->
SpPid ! Msg,
loop({SpPid,SpRef});
{'DOWN',SpRef, process,SpPid,Why} ->
{_, Time1} = statistics(wall_clock),
io:format("Down"),
io:format("Process spawn time = ~p microsecond ~n",[Time1])
end.

test_func() ->
receive
X ->
list_to_atom(X)
end.

执行上述模块的步骤: c(错误句柄 1)。 Pid = errorhandle1:my_spawn(errorhandle1,test_func,[])。 皮德! {makeError,测试}。

有人可以帮助我理解 spawn/3 和 spawn/1 的用法吗?

谢谢,萨提斯。

最佳答案

spawn(fun() -> loop(myspawn_helper(Mod,Fun,Args)) end).

不等同于

spawn(?MODULE , loop , [myspawn_helper(Mod,Fun,Args)]).

在第二种情况下,[myspawn_helper(Mod,Fun,Args)] 是函数 spawn/3 的参数。在函数调用之前评估参数的值。这意味着调用 myspawn_helper(Mod,Fun,Args) 是在调用 spawn/3 之前在原始进程中的新进程之外进行的。你可以看到它是这段代码

SpawnedPidRef = myspawn_helper(Mod,Fun,Args),
spawn(?MODULE , loop , [SpawnedPidRef]).

spawn/1 的等价物看起来像

SpawnedPidRef = myspawn_helper(Mod,Fun,Args),
spawn(fun() -> loop(SpawnedPidRef) end).

现在你可以看出区别了。只有 loop(SpawnedPidRef) 实际上是在一个新进程中完成的。但是在您的第一个版本中,您在新进程中执行 loop(myspawn_helper(Mod,Fun,Args))。你可以这样看

spawn(fun() ->
SpawnedPidRef = myspawn_helper(Mod,Fun,Args),
loop(SpawnedPidRef)
end).

这是非常不同的代码。 (请参阅最后两个 block 。最后一个是您的第一个版本,另一个是您的第二个版本。)

关于Erlang - Spawn MFA vs Spawn Fun,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31459560/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com