2016-07-18 2 views
1

В моем приложении я планирую иметь много рабочих процессов, которые потенциально могут потратить часы на выполнение своей работы.Это обычная практика выхода из процесса kill/2?

Я хочу, чтобы пользователь мог остановить и удалить рабочих.

Допустимо ли kill/2, exit процесс? Будет ли он прекращать процесс, даже если он находится в середине выполнения некоторой работы (т. Е. Загрузки файла)?

Существуют ли у супервизоров аналогичный механизм для остановки и удаления детей, которые находятся в середине выполнения какой-либо работы?

+0

Вы проверили [надзорную документацию] (http://erlang.org/doc/man/supervisor.html)? –

+0

@SteveVinoski Да, моя главная забота заключалась в безусловном прекращении. Кажется, это так, как я узнал ниже. Благодаря! – drozzy

ответ

1

Можно ли убить, exit/2 процесс? Остановит ли он процесс , даже если он находится в середине выполнения некоторой работы (т. Е. загрузки файла)?

Да. Чтобы завершить процесс, вы можете использовать exit/2, как вы сказали. Процедура завершения будет отличаться, если вы установите аргумент Reason: noraml, OtherReason или kill. Это очень хорошо объясняется в документации Error Handling, а также для более подробного объяснения см. this.
Таким образом, вы можете выбрать все, что подходит вашему приложению.

Есть ли у наблюдателей аналогичный механизм для остановки и удаления детей, которые находятся в середине выполнения какой-либо работы?

Да. Как указано в комментарии, в документации Erlang's Supervisor имеется очень хорошая документация. Я предлагаю вам внимательно прочитать все это, но основные части, которые вы ищете, являются:

  1. Определяя child_spec() при запуске ребенка (в основном shutdown и restart опция).
  2. terminate_child/2 для фактического прекращения ребенка.
  3. delete_child/2 для удаления ребенка после звонка terminate_child/2.

Подробнее об этом можно узнать here.

+1

Спасибо, эта часть именно то, что я искал: «Поведение по умолчанию, когда процесс получает выходной сигнал с причиной выхода, отличной от обычной, заключается в завершении ... Когда процесс улавливает выходы, он не заканчивается, когда принимается сигнал выхода. Вместо этого сигнал преобразуется в сообщение {'EXIT', FromPid, Reason}, которое помещается в почтовый ящик процесса, как обычное сообщение. " – drozzy

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