1

Linux環境とMacOSX環境の両方で常に実行されるように設計された3つのプロセスがあります。1つのプロセス(ダウンローダー)は、30秒ごとに大きなXMLファイルのローカルコピーをダウンロードして保存します。他の2つのプロセス(ワーカー)は、保存されたXMLファイルを入力に使用します。各ワーカーはランダムな時間に開始および実行されます。XMLファイルは大きいため、ダウンロードに時間がかかります。ワーカーはまた、それを読んで解析するのに長い時間がかかります。

ワーカーがファイルを読み取ろうとしているときにダウンローダーが保存されたファイルを壊さないようにプロセスを設定する最も安全な方法は何ですか?

4

1 に答える 1

4

iノードベースのファイルシステムを使用するLinuxおよびMacOSXマシンの場合、ダウンロード中にデータを保存するために一時ファイルを使用します(不完全な状態です)。ダウンロードが完了したら、一時ファイルをアトミックアクションで最終的な場所に移動します。

もう少し詳しく説明すると、1つのプロセス(ダウンローダーなど)が他のプロセス(ワーカーなど)によってアクティブに読み取られるファイルを書き込むときに注意すべき2つの主な点があります。

  1. ダウンローダーがファイルの書き込みを完了する前に、ワーカーがファイルを読み取ろうとしないようにしてください。
  2. ワーカーがファイルを読み取っている間、ダウンローダーがファイルを変更しないことを確認してください。

一時ファイルを使用すると、これらの両方の点に対応できます。

より具体的な例として、ダウンローダーがXMLファイルをアクティブにプルしている場合、最終ファイルが保存されるのと同じデバイス/ディスク*上の一時的な場所(「data-storage.tmp」など)に書き込むようにします。ファイルが完全にダウンロードされて書き込まれたら、 bashのようなアトミック(線形化可能)の名前変更コマンドを使用して、ダウンローダーにファイルを最終的な場所(たとえば、「data-storage.xml」)に移動させmvます。

*一時ファイルが最終的なファイルの場所と同じデバイス上にある必要がある理由は、iノード番号が同じままであり、名前変更をアトミックに実行できるようにするためです。

この方法では、ファイルが.tmpの場所にあるため、ファイルのダウンロード/書き込み中にワーカーに表示されないようにします。名前の変更はiノードで機能するため、新しいバージョンのデータストレージファイルが配置されている場合でも、ファイルを開いたすべてのワーカーが古いコンテンツを引き続き表示するようにします。

Downloaderは、名前を変更するときに「data-storage.xml」を新しいiノード番号にポイントしますが、ワーカーは以前のiノード番号から「data-storage.xml」にアクセスし続けるため、その状態のファイルで作業を続けます。 。同時に、Downloaderが名前の変更を行った後に新しいコピー「data-storage.xml」を開くワーカーは、ファイルシステムで直接参照されるようになったため、新しいiノード番号のコンテンツを表示します。したがって、2人のワーカーが同じファイル名(data-storage.xml)から読み取ることができますが、ファイルが最初に開かれたときにファイル名がポイントされたiノードに基づいて、それぞれがファイルの内容の異なる(そして完全な)バージョンを表示します。 。

これが実際に動作することを確認するために、githubでこの機能を示す簡単なサンプルスクリプトのセットを作成しました。また、一時ファイルソリューションの使用がご使用の環境で機能することをテスト/検証するためにも使用できます。


重要な注意点は、重要なのは特定のデバイス上のファイルシステムであるということです。LinuxまたはMacマシンを使用しているが、FATファイルシステム(たとえば、USBサムドライブ)を使用している場合、この方法は機能しません。

于 2013-03-20T09:02:06.143 に答える