4

構成ファイルと対話するライブラリがあります。ライブラリがインポートされると、初期化コードは構成ファイルを読み取り、場合によってはそれを更新してから、更新された内容をファイルに書き戻します (何も変更されていない場合でも)。

非常にまれに、構成ファイルの内容が単に消えるという問題に遭遇します。具体的には、(ライブラリを使用して) 短いスクリプトの呼び出しを連続して何千回も実行すると、これが発生します。同じディレクトリでは決して発生しないため、これはややランダムな問題、特に IO との競合状態であると思われます。

問題を確実に再現することはできず、一部のシステムでのみ発生するため、これをデバッグするのは面倒です。私は何が起こるかについて疑いを持っていますが、Python でのファイル I/O の図が正しいかどうかを確認したかったのです。

問題は、Python プログラムが実際にファイルの内容をディスクに書き込むのはいつでしょうか? ファイルが閉じられるまでに内容がディスクに作成されると思っていましたが、このエラーを説明することはできません。Python がファイルを閉じるとき、内容をディスク自体にフラッシュするか、単にファイルシステムにキューに入れますか? Python の終了後にファイルの内容をディスクに書き込むことは可能ですか? (ファイルハンドルはfp.flush(); os.fsync(fp.fileno())どこにありますか)を使用してこの問題を回避できますか?fp

問題があれば、私は Unix システム (具体的には Mac OS X) でプログラミングしています。編集:また、プロセスが同時に実行されていないことに注意してください。

付録: 私が疑う特定の競合状態は次のとおりです。

  1. プロセス #1 が呼び出されます。
  2. プロセス #1 は、構成ファイルを読み取りモードで開き、終了したら閉じます。
  3. プロセス #1 は、構成ファイルを書き込みモードで開き、その内容をすべて消去します。内容の消去はディスクに同期されます。
  4. プロセス #1 は、新しい内容をファイル ハンドルに書き込み、それを閉じます。
  5. プロセス #1: ファイルを閉じると、Python は OS に、これらのコンテンツをディスクに書き込むキューを作成するよう指示します。
  6. プロセス #1 が閉じて終了します
  7. プロセス #2 が呼び出されます
  8. プロセス #2 は構成ファイルを読み取りモードで開きますが、新しいコンテンツはまだ同期されていません。プロセス #2 は空のファイルを認識します。
  9. プロセス 2 がファイルを読み取った後、OS はディスクへのコンテンツの書き込みを最終的に終了します。
  10. プロセス #2 は、ファイルが空であると考えて、構成ファイルのデフォルトを設定します。
  11. プロセス #2 は、そのバージョンの構成ファイルをディスクに書き込み、最後のバージョンを上書きします。
4

1 に答える 1