0

私はBottle.pyで次の静的ルートを定義しました

@get('/create/new/image', apply=[auth_request])
def request_new_image():
   file = invoke_image_creation()
   return static_file(file, root='pics',
                      mimetype='image/jpg')

このメソッドinvoke_image_creation()では、単純なイベントロック(threading.Event)を使用して、イメージが作成されるまでアプリケーションをブロックします。次に、静的ファイルを返す必要があります。

小さい画像の場合、これは機能します。大きい画像(1280x720、約50 KB)の場合、次のようになります。

  • HTTP 200
  • 応答するコンテンツはありません
  • コンテンツの長さ:0
  • MIMEタイプ:image / jpg

ブロッキングは、それがそこにあることを確認するために、ほんの一瞬だけ続きます。

何が原因でしょうか?単純なルーティング静的ファイル機能を使用すると、まったく同じ画像で問題なく機能します。唯一の違いは、ファイルが事前に存在し、HTTPGETリクエストで定義されていることです。

4

1 に答える 1

1

ファイルを開いてからファイルデータがディスクにフラッシュされるまでに遅延があるため、ファイル作成イベントを監視している場合は、本質的にまだ空のファイルであるものを簡単に返すことができます。

新しいファイルではなく変更をリッスンするように通知を変更するか、新しいファイルが完全に形成されていることを確認する必要があります。

後者を行うには、外部プロセスを変更して別の場所にファイルを作成し、画像が作成されたらファイルを監視している場所に移動します。2つの場所が同じパーティション上にある場合、移動はアトミックになります。ファイル監視でファイルが表示されていることを確認した場合、その時点でファイルが空でないことが保証されます。

または、別のプロセスでの疑似pythonコード:

import shutil

createImage(locA, filename)
shutil.move(os.path.join(locA, filename), locB)

そして見てlocBください。

于 2013-01-15T20:27:38.897 に答える