13

私はpythonのos.path.getmtime()機能に簡単な問題があります。私はいくつかの奇妙な行動を観察しました。特定のファイルが変更されているかどうかを定期的にチェックし、それに基づいて更新するかどうかを決定する Web アプリに取り組んでいます。

私のローカルのpythonコマンドラインでは、ファイルを変更しos.path.getmtime(file_name)て戻り値を呼び出すと、ファイルmtimeの変更を反映するように変更されました。

ただし、Web アプリで呼び出すos.path.getmtime()と、変更前と変更後の戻り値は同じです。私はオンラインでいくつかの調査を行い、ファイルへの変更を登録するにはosモジュールをリロードする必要があることを示唆するものをいくつか見つけました。osそのため、Web アプリでモジュールをリロードしmtimeましたが、ファイルへの変更はまだ反映されていません。他の誰かが以前にこの問題に遭遇したか、解決策を知っていますか? webapp から以下のコード スニペットを含めました。

import os

def function_name():
    reload(os)
    file_path = '/dir/lib/some_file.js'

    try:
        mtime = os.path.getmtime(file_path)
    except os.error:
        pass

    return mtime
4

3 に答える 3

3

今日これに遭遇し、この質問を見つけたので、ここに文書化すると思いました。私のケースは単体テストだったので、手動テストよりも時間スケールが小さいため、少し異なる場合があります。

変更時間は、ファイル システムによって制限されます。変更時刻を確認し、少量のデータを書き込んでから再度変更時刻を確認すると、2 つのタイムスタンプが完全に一致する可能性があります。最初のタイム スタンプ チェックと書き込みの終了の間の時間が時間分解能よりも短い場合、それらは等しくなります。

さまざまな一般的なファイル システムの時間分解能に関する統計:

  • FAT32: 2秒
  • ext3: 1秒
  • exFAT: 10ms
  • NTFS: 100ns
  • ext4: 1ns

組み込みシステムは FAT を使用し、2 秒の時間分解能を持つことが期待できます。古い W​​indows システムでは、2 秒の範囲になります。新しい Windows システムでは、100ns または 10ms になります。古い UNIX システムには 1 が含まれることがよくあります。新しい UNIX システムの解像度は 1ns です。

が時間分解能よりも小さい場合<time for time stamp check> + <time for file write>、ファイルは変更されていないように見える可能性があります。

私はこれらの可能な解決策を見ます:

  • 作成中のファイルのヘッダーに、より正確な変更時刻を含めます。ファイルライターは、書き込み前にファイルが既に存在するかどうかを確認し、ナノ秒の変更時間を少なくとも 1 増やして、更新を保証することもできます (タイムスタンプの精度は犠牲になります)。
  • 各ファイルが編集された頻度を別の場所に保存します。この番号を使用して、最後にチェックしてから編集されたかどうかを確認します。ファイルをアトミックに書き込み、変更カウントを一緒に更新することはおそらく不可能であることに注意してください。
  • おそらく、最初のタイムスタンプのチェックとファイルの書き込みの間の時間が常に少なくとも最小の時間分解能になるように、スリープを使用していくつかの策略を考案することができます。これはセットアップのタイプに大きく依存し、スレッドをブロックします。
于 2016-08-29T02:02:33.860 に答える
1

これをコメントとして追加するのに十分な評判がありません...

どのようにテストしているかは明確ではありません。Web アプリの 1 つのページを実行します。

  • 印刷時間
  • ファイルを更新する
  • 印刷時間

または

  • 単にmtimeを印刷する

Web アプリのテスト プロセスが

  • テスト mtime ページのリクエスト
  • ファイルを手動で更新する
  • テスト mtime ページのリクエスト
  • 両方のページ ビューで mtime が同じであることに注意してください

私の最初の推測は、Web クライアント、プロキシ、またはサーバーのキャッシングです。

于 2013-10-03T12:33:34.303 に答える
0

おそらく、サイズなどの mtime 以外のファイルの一般的な統計を取得してみてください。

サーバーでの変更前と変更後 (つまり、ターミナル ウィンドウで ls -l を表示したとき) のファイルの予想サイズ/mtime は同じですか、それとも異なりますか。

そのようなコマンド ライン ツールを使用したときの統計が同じである場合は、ファイルが編集されていない可能性があります。

size/mtime が異なる場合は、おそらく使用します

os.stat(filename)

そして、それが正しい値のいずれかを与えるかどうかを確認してください。

于 2013-10-01T16:28:33.433 に答える