В Perl 6 нет надежной финализации объекта. Есть поддержка DESTROY
, но она будет вызываться только тогда, когда объект действительно собран сборщиком мусора. Сборка мусора не происходит при глобальном завершении работы, а происходит тогда, когда это необходимо (независимо от эвристики, которую он решит).
Следующий код показывает, что когда объекты собираются сборщиком мусора, они вызывают DESTROY
:
my int $destroyed;
class A {
method DESTROY { ++$seen }
}
A.new for ^50000;
say "DESTROY called $destroyed times";
Как правило, выводится что-то вроде: «DESTROY вызывается 31095 раз».
Если вы хотите надежного уничтожения, вы можете использовать LEAVE
фазовращатели или черту will leave
:
my $dbh = DBI.connect(....);
LEAVE $dbh.disconnect;
или короче:
my $foo will leave { say "left with $_" } = 42;
# left with 42
Следует понимать, что подсчет ссылок, который обеспечивает надежное уничтожение, имеет свои проблемы (циклические ссылки, поэтому вам нужны слабые ссылки, отказ от совместного использования общей памяти, потому что он должен обновлять счетчики, код XS ошибается и т. Д. И т. Д.). В чисто многопоточной среде это становится неприемлемым, потому что вам нужно будет выполнять подсчет всех ссылок атомарно (либо с использованием аппаратных функций, либо путем блокировки). Что, помимо общего замедления работы, открывает целый новый пул возможных тупиковых ситуаций.
person
Elizabeth Mattijsen
schedule
13.06.2018