Erlang закончить или убить процесс - PullRequest
6 голосов
/ 16 января 2012

У меня есть приложение erlang. В этом приложении я запускаю процесс с spawn(?MODULE, my_foo, [my_param1, my_param2, my_param3]).

И my_foo:

my_foo(my_param1, my_param2, my_param3) ->
  ...
  some code here
  ...
  ok.

Когда я открываю etop, я вижу, что это состояние функции my_foo / 3: proc_lib:sync_wait/2

Чем я пытаюсь поставить exit (self (), normal) в конец моей функции, но я вижу такое же поведение: proc_lib:sync_wait/2 в etop.

Как правильно завершить процесс или выйти из него?

Спасибо.

Ответы [ 2 ]

18 голосов
/ 19 января 2012

Обратите внимание, что exit(Pid, Reason) и exit(Reason) do NOT делают то же самое, если Pid - это сам процесс. exit/1 сообщает текущему процессу о выходе - из внутри , если хотите - в то время как exit/2 отправляет сигнал выхода процессу, даже если процесс сам по себе. Поэтому, когда вы делаете exit(self(), normal), вы фактически посылаете себе сигнал выхода normal, который игнорируется.

В этом случае помещение вызова exit в конец функции не должно иметь никакого значения, поскольку процесс автоматически умирает (с причиной normal), когда завершается функция, с которой он был запущен. Похоже, что процесс приостановлен где-то до этого.

proc_lib:sync_wait/2 вызывается внутри proc_lib:start/start_link и сидит и ждет, когда порожденный процесс выполнит proc_lib:init_ack/1/2, чтобы вернуть возвращаемое значение для запуска. Казалось бы, ваш процесс не вызывает init_ack.

0 голосов
/ 16 января 2012

На основании ограниченной информации, которую вы предоставляете в вопросе, я подозреваю, что ваш процесс еще не завершен.

Обычно вам не нужно добавлять exit/2 в ваш процесс. Он завершится автоматически после завершения работы функции.

Возможно, в some code here у вас длительный вызов, который еще не завершен. Я рекомендую вам добавить информацию о регистрации и посмотреть, где вы застряли.

...