1

私はPython HTTPサーバーを持っています。特定のGETリクエストでファイルが作成され、その後レスポンスとして返されます。ファイルの作成には、ファイルの変更 (更新) にそれぞれ 1 秒かかる場合があります。

したがって、すぐにファイルを応答として返すことはできません。このような問題にどのようにアプローチすればよいでしょうか。現在、次のような解決策があります。

 while not os.path.isfile('myfile'):
      time.sleep(0.1)
 return myfile

これは非常に不便に思えますが、もっと良い方法はありますか?

簡単な通知で十分ですが、ファイルを作成/更新するプロセスを制御できません。

4

4 に答える 4

0

同期HTTPリクエストにブロッキングIO操作を実装することは、悪いアプローチです。多くの人が同じ手順を同時に実行すると、すぐにスレッドが不足する可能性があります(スレッドプールが限られている場合)。私は次のことをします:

クライアントがファイル作成URIを要求します。ファイル生成手順はバックグラウンドプロセス(一部の非同期タスクシステム)で初期化され、ユーザーはHTTP応答でファイルID/名前を取得します。次に、クライアントは時々AJAX呼び出しを行い(ポーリング)、ファイルが作成/変更されているかどうかを確認します(個別のファイル提供/チェック-存在するURI)。ファイルが最終的に作成されると、ユーザーはURIを提供するファイルにリダイレクトされます(jswindow.location)。

このアプローチにはもう少し作業が必要ですが、最終的には効果があります。

于 2013-01-04T06:57:27.547 に答える
0

を使用してみてくださいos.path.getmtime。これにより、ファイルの変更時刻がチェックされ、1 秒未満の場合は返されます。また、限られた量の試行のみを行うことをお勧めします。そうしないと、ファイルが作成/変更されない場合に無限ループに陥ります。そして、@Krzysztof Rosińskiが指摘したように、おそらくノンブロッキングな方法でそれを行うことを考えるべきです。

import os
from datetime import datetime
import time

for i in range(10):
    try:
        dif = datetime.now()-datetime.fromtimestamp(os.path.getmtime(file_path))
        if dif.total_seconds() < 1:
            return file            
    except OSError:            
        time.sleep(0.1)
于 2013-01-04T06:58:38.903 に答える
0

Watchdogファイルシステムを監視するためのより良い方法に使用できますか?

于 2013-01-04T07:31:21.720 に答える