2012-02-16 17 views
2

В Erlang можно ли автоматически активировать функцию очистки, когда все ссылки на ресурс уходят? Например, будет ли закрыт собственный дескриптор файла, вызванный вызовом file:open/2, если file:close/1 никогда не вызывается? Если это возможно, как это делается? Если это невозможно, есть ли иудиомы Erlang, которые делают утечки ресурсов подобным образом, это не проблема?Очистка ресурсов в Erlang

ответ

5

Из filedocumentation:

IoDevice действительно Идентификатор процесса, который обрабатывает файл. Этот процесс связан с процессом, который первоначально открыл файл. Если какой-либо процесс, с которым связана связь IoDevice, завершается, файл будет закрыт, и сам процесс будет завершен. IoDevice, возвращенный из этого вызова, может использоваться как аргумент для функций ввода-вывода (см. Io (3)).

Итак, если процесс, который открыл файл, файл будет автоматически закрыт.

Если вы используете OTP, и вы хотите быть абсолютно уверены, что ваш файл был закрыт, когда ваш процесс умирает, добавьте file:close в функцию terminate. Конечно, ваш gen_ * должен быть прикреплен к супервизору.

+0

Я думаю, что получаю. Поэтому, если у вас есть код, управляющий ресурсом (например, файл), вы «связываете/1» свой процесс с процессом собеседника. Таким образом, ваш код может обрабатывать выходной сигнал, когда вызываемый абонент заканчивает и очищает. Я полагаю, что поддержка обратного вызова, подобранного финализатором, не будет, если обработчик ресурсов (например, IoDevice) должен быть собран в мусор, даже когда процесс вызова продолжается. И, если это так, использование процессов мелкозернистым способом - это хорошая практика для минимизации утечек ресурсов (среди других причин). –

+1

Если ваш процесс является долгоживущим, и вы используете этот файл только на короткий период времени, вы должны напрямую вызвать функцию закрытия. Если возникает ошибка и ваш процесс умирает, файл будет закрыт автоматически, нет необходимости в явной ссылке. – Isac

+1

@FrankHunleth: для обратного вызова, подобного комментарию, смотрите выражение 'after' в выражении [' try'] (http://www.erlang.org/doc/reference_manual/expressions.html#id78318). Он был добавлен к языку в последнее время, но это не является предпочтительным способом, как это сделать. Нерестовые процессы и мониторинг или связывание более удобны. –

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