最近、python に関する記事しか書いてない上に、
きっと初歩的なことなんだろうと思いつつ、徒然に書き続ける今日この頃。
さて、昨日も書いたとおり、今までの実装環境はほとんどC言語な自分ですが、
そこから見たpythonについてさらに考えてみる。
C言語を書く際には、自分で動的メモリ管理をしなければいけない都合上、
かなり厳密にメモリ管理を行っているつもり。無駄だと知りつつ、
プログラムの終了時(正常、異常に関わらず)には、動的に確保したメモリ領域を
きちんと解放してからプログラムを終了するようにしているくらい。
翻ってpythonを見てみると、ガベージコレクションが充実しており、
明示的なメモリ解放をしなくてもよくなっている。これは、まあメモリ管理に
対する感覚を磨くという意味で正しいのかはわからないけど、便利であること
には間違いない。ところが、この便利な機能のせいで例外がどうしても消えない。。。
ガベージコレクションは基本的に参照を監視していて、誰からも参照されなく
なったらそのオブジェクト(メモリ領域)を解放するんだと思うけど、
もし、一見独立に見える二つのオブジェクトが実はお互いに依存していた
場合にはどうなるのだろうか。
わりとネットワーク周りのプログラミングをすることが多い自分は、
pythonでは、イベント監視する用にオブジェクトを生成していて、
誰かと通信するためのネットワークソケットはそのオブジェクトの
キューの様なリストに登録して送受信の際にはイベント監視用オブジェクト
を介して行っている。
なので、プログラムの終了時には、イベント監視用オブジェクトのキュー
リストからソケットを取り除き、そのソケットを閉じる。次いで、
イベント監視用オブジェクトはキューリストに監視対象が含まれないことを
確認した上で、自らのデストラクタを呼ぶ。というようにしたい訳だけど、
現状書いているコードではまずイベント監視用オブジェクトが削除され、
ついてソケットオブジェクトが削除されている。ソケットオブジェクトを
削除する際にイベント監視用オブジェクトのキューから自分を除くように
書いているために、すでに存在しないオブジェクトのメソッドを呼び出そう
として、例外が発生しているっぽい。
こういう呼び出し順序どうにかできないのだろうか。というのが、
今日のいいたいことです。結論が出ていません。。。
ちなみに、python レベル12級くらいな自分なのでここに書いていることが
本当なのか正直全く自信ありません。
0 件のコメント:
コメントを投稿