Я начинаю работать с Erlang, и мне не помешала бы небольшая помощь в понимании различных результатов при применении PID, возвращаемого из spawn/3
, в метод process_info/1
.
Учитывая этот простой код, в котором экспортируется функция a/0
, которая просто вызывает b/0
, ожидающую сообщения:
-module(tester).
-export([a/0]).
a() ->
b().
b() ->
receive {Pid, test} ->
Pid ! alrighty_then
end.
... пожалуйста, помогите мне понять причину другого вывода из оболочки:
Пример 1:
Здесь current_function
из Pid
показано как tester:b/0
:
Pid = spawn(tester, a, []).
process_info( Pid ).
> [{current_function,{tester,b,0}},
{initial_call,{tester,a,0}},
...
Пример 2:
Здесь current_function
из process_info/1
показано как tester:a/0
:
process_info( spawn(tester, a, []) ).
> [{current_function,{tester,a,0}},
{initial_call,{tester,a,0}},
...
Пример 3:
Здесь current_function
из process_info/1
показано как tester:a/0
, но current_function
из Pid
равно tester: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
в фоновом режиме происходит какой-то асинхронный код, но как работает назначение переменных и передача аргументов (особенно в последнем примере), так что Pid
получает одно значение, а 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}},
...
Не знаю, что со всем этим делать. Возможно, мне просто нужно смириться с тем, что это выше моей зарплаты!