1

私は、Pythonのマルチプロセッシングモジュール2.6を使用して2つのワーカープロセスを作成します。 各作業者では、作業員を監視するために標準ログモジュール(ログローテーションと作業者ごとのファイル) を使用します。私は数時間後にも、 イベントがログに書き込まれなくなったことに気づいた。プロセスはクラッシュするようには見えず、私のキューを経由してコマンドに と応答します。 lsofを使用すると、ログファイルが開いていないことがわかります。 ガベージコレクタによってログオブジェクトが殺されるのではないかと疑いますが、それを保護するためにマークする方法がある場合は ですか?マルチプロセスプロセスのガベージコレクタからログオブジェクトを保護するにはどうすればよいですか?

+1

GCにはGCが関係しているとは本当に疑問です... –

答えて

1

@ THC4kに同意します。これはGCの問題のようには見えません。私はなぜあなたに私の理由を教えてくれるでしょう、もし私が間違っていたら誰かが私に投票してくれると確信しています(もしそうなら、私のエラーを指摘するコメントを残してください)。

CPythonを使用している場合、主に参照カウントが使用され、参照カウントがゼロになるとオブジェクトは即座に破棄されます(循環参照の大文字と小文字を区別するために補助ガベージコレクションも提供されます)。あなたのログオブジェクトへの参照を保持すると、破壊されません。

JythonまたはIronPythonを使用している場合は、基になるVMがガベージコレクションを行います。再度、参照を保持し、GCはそれに触れてはいけません。

いずれにせよ、あなたは、生き続ける必要があるオブジェクトへの参照を保持していないか、他のエラーがあるようです。

+0

CPythonにはマークとスイープガベージコレクタがあります。パフォーマンスの改善として参照カウントを使用するため、非循環データ構造をマークしてスイープする必要はありません。いずれにしても、何かを収集したくない場合には解決策は同じです。 – stonemetal

+0

@stonemetal:ありがとう。私は私の答えを編集しました。 –

+0

私はまだ問題を追跡していませんが、lsof(htop)経由でファイルハンドルが失われているという報告が間違っているように見えます。私はhtop/lsofの統合にバグがあると思います:) – Marinus

0
http://docs.python.org/reference/datamodel.html#object.__del__ 

デル()メソッドは、オブジェクトの破壊に呼び出されたこの文書によると、この時点で収集されてからそれを防ぐために、オブジェクトへの参照を作成することができます。私はこれを行う方法がわからない、うまくいけば、これはあなたに考えのためのいくつかの食糧を与える。

0

fork()の直後にgc.collect()を実行すると、ログが閉じられるかどうかを確認できます。しかし、おそらくガベージコレクションは数時間後に有効になるわけではありません。

関連する問題