Python предоставляет метод __del__
dunder для классов, которые будут вызываться при сборке мусора, , если сборщик мусора .
При использовании метод __del__
обычно выполняет некоторую очистку.
Из-за того, что довольно легко непреднамеренно предотвратить сбор объекта, полагается на __del__
для выполнения очистки (вместо, скажем, __exit__
диспетчера контекста или явного .close()
метода), как правило, не рекомендуется.
Ваша ошибка выдвигает на первый план другую причину отказа от использования __del__
, однако: то, что во время выключения будет вызываться __del__
, но, возможно, после освобождения .
из-за других вещей, на которые она опирается
Предлагаемые обходные пути по проблеме github, связанные в комментариях, должны быть поучительными, поскольку все они гарантируют, что очистка выполняется в то время, когда вещи, на которые опирается очистка (например, sys.meta_path
), все еще находятся в определенном / не определенном состоянии. еще не освобожден, например:
try:
del env
except ImportError:
pass
и
env = gym.make('CartPole-v0')
...
env.env.close()
и (вероятно, но гораздо менее эффективно или ясно)
import gc; gc.collect()