Erlang: устойчивость к смерти владельца порта

Что происходит, когда процесс, владеющий порожденным портом, умирает и перезапускается супервизором?

  1. Есть ли способ, чтобы старый порт не умер вместе с его владельцем, а новый владелец «вступил во владение»?

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


person Alexey Romanov    schedule 08.11.2010    source источник


Ответы (1)


Во-первых, обратите внимание, что вы не хотите, чтобы владелец порта умер. Так что переместите любой «опасный» код в другой процесс и сделайте владельца порта настолько тупым, насколько это возможно. Это устранение ошибок в стиле Erlang. Теперь, если этот процесс умирает, что-то действительно плохо, поэтому в этом случае может быть разумно перезапустить и порт. Но так как мы все вывезли, то рассчитываем, что этого не произойдет.

Что касается 2, порт отправит определенное сообщение, когда он завершится, поэтому вы можете настроить свой порожденный процесс, чтобы изящно обнаружить это и завершиться с ним. Видеть

http://www.erlang.org/doc/reference_manual/ports.html

person I GIVE CRAP ANSWERS    schedule 09.11.2010
comment
Я не думаю, что порт отправляет специальное сообщение порожденному процессу, и я не вижу этого в документации, на которую вы ссылаетесь. Что произойдет, так это то, что канал к процессу закрыт, и это вы можете поймать в самом процессе (например, поиск eof на вашем входе) - person Peer Stritzinger; 09.11.2010
comment
Но должен также сказать, что я абсолютно согласен с вашим первым абзацем - person Peer Stritzinger; 09.11.2010
comment
Извините, но вы не правы. В таблице 14.3 перечислены причины выхода последнего сообщения. Вы также можете вызвать link/1 для порта, чтобы связать его, если хотите. Также обратите внимание, что для получения этого сообщения ваш процесс должен перехватывать сигналы выхода через process_flag/2, иначе он не будет работать. - person I GIVE CRAP ANSWERS; 10.11.2010
comment
Я думаю, что вы говорите здесь о разных вещах. Peer описывает, как процесс внешнего порта видит, что порт был закрыт (eof на его входном канале), а NOT CRAPPY ANSWERS описывает, как его видит подключенный процесс erlang. - person rvirding; 10.11.2010