簡體   English   中英

Erlang - Spawn MFA vs Spawn Fun

[英]Erlang - Spawn MFA vs Spawn Fun

我一直在努力使用編程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(errorhandle1)。 Pid = errorhandle1:my_spawn(errorhandle1,test_func,[])。 Pid! {makeError,測試}。

有些人可以幫助我理解spawn / 3和spawn / 1的用法嗎?

謝謝,Sathish。

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).

這是非常不同的代碼。 (參見最后兩個塊。最后一個是第一個版本,另一個是第二個版本。)

我運行你的代碼時沒有看到任何問題,除了測試應該是Pid! {makeError, “測試”}。 所以元組的第二個字段是一個列表,而不是一個原子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM