1

私は Python の初心者で、次のような問題に直面しています。設定ファイルを定期的に読み取り、それらの設定に従って何かを実行するスクリプトがあります。ユーザー入力値で設定ファイルを書き込む UI によってトリガーされる別のスクリプトがあります。ファイルの読み取りと書き込みの両方に ConfigParser モジュールを使用します。

このシナリオが一貫性のない状態につながる可能性があるかどうか疑問に思っています (設定ファイルの読み取り中に、他のスクリプトが書き込みを開始するなど)。このような状況から自動的に保護するメカニズムが舞台裏にあるかどうかはわかりません。

このような不整合が発生する可能性がある場合、両方のスクリプトを同期して操作の整合性を維持するために何を使用できますか?

4

3 に答える 3

1

私は Python の初心者で、次のような問題に直面しています。設定ファイルを定期的に読み取り、それらの設定に従って何かを実行するスクリプトがあります。ユーザー入力値で設定ファイルを書き込む UI によってトリガーされる別のスクリプトがあります。

ライターがファイルに書き込みを行っている間にリーダーが読み取りを行うと、競合状態が発生する可能性があります。そのため、リーダーはファイルが不完全なときに読み取る可能性があります。

読み書き中にファイルをロックすることでこの競合から保護できます ( Linux flock()またはPython lockfile モジュールを参照)。これにより、リーダーはファイルが不完全であることを決して観察しません。

または、最初に一時ファイルに書き込み、完了したらアトミックに最終的な名前に名前を変更することもできます。このようにして、リーダーとライターは決してブロックしません:

def write_config(config, filename):
    tmp_filename = filename + "~"
    with open(tmp_filename, 'wb') as file:
        config.write(file)
    os.rename(tmp_filename, filename)

ライターが上記の方法を使用する場合、リーダーに変更は必要ありません。

于 2013-10-16T18:24:26.510 に答える
0

構成ファイルを書き込むときは、最初に一時ファイルに書き込みます。完了したら、名前を正しい名前に変更します。名前の変更操作 ( os.rename) は通常、Unix システム、Linux、および Windows でもアトミック操作として実装されていると思います。そのため、書き込みがまだ完了していない間に他のプロセスが構成を読み取ろうとするリスクはありません。

于 2013-10-16T18:22:51.137 に答える
0

この問題に対処するには、少なくとも 2 つの方法があります (UNIX 系のシステムを使用していると仮定します)。

  • 書き込みたい場合は、最初に一時ファイルに書き込み、次にunix がアトミックに実行できること、特にrename一時ファイルを所定の場所に書き込みます。

  • このfilelockモジュールの助けを借りて、操作中にファイルをロックします。

個人的には、 OSを利用する最初のオプションが気に入っていますが、一部のシステムでは原子性に問題がありました。

于 2013-10-16T18:24:28.080 に答える