pickleモジュールのドキュメントには、サンプルコードのスニペットがあります。
reader = pickle.load(open('save.p', 'rb'))
これは、最初に読み取ると、システムファイル記述子を割り当て、その内容を読み取り、開いている記述子を「リーク」するように見えました。これは、呼び出すためにアクセスできるハンドルがないためclose()
です。これは、このケースを処理する隠された魔法があるかどうか疑問に思いました。
ソースを調べてみると、Modules / _fileio.cで、ファイル記述子がfileio_dealloc()デストラクタによって閉じられていることがわかりました。これが実際の質問につながりました。
上記のサンプルコードで使用されているファイルオブジェクトの期間はどのくらいですか?そのステートメントが実行された後、オブジェクトは実際に参照されなくなりますか?したがって、fdはclose(2)
将来のガベージコレクションスイープで実際の呼び出しの対象になりますか?もしそうなら、例の行は良い習慣ですか、それともfdがリリースされることを期待してはいけないので、カーネルのプロセスごとの記述子テーブルが使い果たされる危険がありますか?