2013-04-09 2 views
1

Say Я работаю с некоторыми простыми процессами в erl:Erlang: Что происходит, когда вы f() Pid в erl?

1> Fun = fun(F) -> F(F) end. 
#Fun<erl_eval.6.82930912> 
2> Pid = spawn(fun() -> Fun(Fun) end). 
<0.178.0> 
3> f(Pid). 

Что происходит, когда я f(Pid).? Выходит ли процесс или я просто теряю свою ссылку на него?

ответ

3

Согласно documentationf(Pid) удаляет привязку переменной Pid, ​​процесс не останавливается.

Вы можете протестировать его таким образом: предположим, что у вас есть gen_server под названием myserver, который основан на скелете, предоставляемом режимом emacs erlang.

1> {ok, Pid} = myserver:start_link(). 
{ok,<0.39.0>} 
2> f(Pid). 
ok 
3> gen_server:call(pid(0,39,0), mycall). 
ok 
4> gen_server:call(myserver, mycall). 
ok 

Как вы можете видеть, даже если мы сделали f(Pid) мы все еще можем связаться процесс, используя идентификатор процесса или атом, используемый при регистрации (в нашем случае имя модуля).

+1

Спасибо! Я чувствую, что документация неясна в отношении того, что происходит, когда вы удаляете привязку, но ваш пример делает это явным образом. – 2rs2ts

+2

@agarrett Процессы никогда не исчезают только потому, что нет ссылок на них. Они либо умирают, когда они выполняют свою функцию, либо возникает ошибка, либо они убиваются другим процессом. – rvirding

Смежные вопросы