4

私はErlangを使い始めておりspawn/3process_info/1メソッドに返されたPIDを適用するときにさまざまな結果を理解するのに少し役立つかもしれません。

関数がエクスポートされるこの単純なコードを考えると、メッセージを待機するをa/0呼び出すだけです。b/0

-module(tester).
-export([a/0]).

a() ->
    b().
b() ->
    receive {Pid, test} ->
        Pid ! alrighty_then
    end.

...シェルからの出力が異なる理由を理解するのを手伝ってください:


例1:

ここで、current_functionofPidは次のように表示されtester:b/0ます。

Pid = spawn(tester, a, []).

process_info( Pid ).

> [{current_function,{tester,b,0}},
    {initial_call,{tester,a,0}},
    ...

例2:

ここで、current_functionofprocess_info/1は次のように表示されtester:a/0ます。

process_info( spawn(tester, a, []) ).

> [{current_function,{tester,a,0}},
    {initial_call,{tester,a,0}},
    ...

例3:

ここで、current_functionofprocess_info/1はであると示されてtester:a/0いますが、current_functionofPidtester:b/0:です。

process_info( Pid = spawn(tester, a, []) ).

> [{current_function,{tester,a,0}},
    {initial_call,{tester,a,0}},
    ...

process_info( Pid ).

> [{current_function,{tester,b,0}},
    {initial_call,{tester,a,0}},
    ...

が呼び出されたときにバックグラウンドで非同期コードが発生していると思いますspawn/3が、変数の代入と引数の受け渡しは(特に最後の例では)Pid1つの値をprocess_info/1取得し、別の値を取得するようにどのように機能しますか?

そのような場合に変数の代入をバインドするErlangに特別なものはありますが、引数の受け渡しにはそのようなバインドは提供されていませんか?


編集:

このような関数を使用する場合:

TestFunc = fun( P ) -> P ! {self(), test}, flush() end.

TestFunc( spawn(tester,a,[]) ).

...メッセージはから正しく返されますtester:b/0

Shell got alrighty_then
ok

しかし、私がこのような関数を使用する場合:

TestFunc2 = fun( P ) -> process_info( P ) end.

TestFunc2( spawn(tester,a,[]) ).

...process_info/1まだ表示されますtester:a/0

[{current_function,{tester,a,0}},
 {initial_call,{tester,a,0}},
 ...

これらすべてをどうすればよいかわからない。たぶん、私はそれを私の賃金等級を超えているとして受け入れる必要があります!

4

2 に答える 2

9

spawnのドキュメントを見ると、新しく作成されたPidが返され、新しいプロセスがシステムスケジューラキューに配置されることが示されています。つまり、プロセスは開始されますが、呼び出し元は実行を続けます。

Erlangは、明示的に制御を譲る必要がないという点で他のいくつかの言語とは異なりますが、プロセススケジューラに依存して、どのプロセスをいつ実行するかを決定します。に割り当てを行っている場合Pid、スケジューラには、生成されたプロセスに切り替えるための十分な時間があり、その後、が呼び出されましたb/0

于 2011-06-20T23:00:03.647 に答える
6

とても簡単です。生成されたプロセスの実行は、a()の呼び出しで始まり、その直後のある時点でb()が呼び出され、そこに座って特定のメッセージを受信するまで待機します。pidでprocess_infoをすぐに呼び出すことができる例では、プロセスがまだa()を実行している間にそれをキャッチします。その他の場合、遅延が発生すると、b()を呼び出した後でそれをキャッチします。これはどうですか?

于 2011-06-20T22:42:14.967 に答える