かなりの量のメモリを消費する可能性のある非常に大きな Python クラスがあるとします。クラスには、インタープリターが終了したときにいくつかのものをクリーンアップする責任があるいくつかのメソッドがあり、atexit モジュールに登録されます。
import atexit
import os
class ReallyBigClass(object):
def __init__(self, cache_file):
self.cache_file = open(cache_file)
self.data = <some large chunk of data>
atexit.register(self.cleanup)
<insert other methods for manipulating self.data>
def cleanup(self):
os.remove(self.cache_file)
このクラスのさまざまなインスタンスは、プログラムの存続期間中に出入りする可能性があります。私の質問は次のとおりです。
del
たとえば、インスタンスへの他のすべての参照の場合、インスタンス メソッドを atexit に登録することは安全ですか? 言い換えれば、atexit.register()
従来のバインディングと同じ方法で参照カウンターをインクリメントしますか? もしそうなら、メソッドの 1 つが atexit に登録されているため、クラス インスタンス全体がメモリ内でハングアップし、終了するまで待機する必要がありますか? または、インスタンスの一部をガベージ コレクションできますか? ガベージ コレクションが効果的に行われるように、このような一時的なクラス インスタンスの終了時にそのようなクリーンアップを構成するための好ましい方法は何でしょうか?