3

bottlepy で記述された Python Web アプリケーションがあります。その唯一の目的は、人々が処理される大きなファイルをアップロードできるようにすることです (処理には約 10 ~ 15 分かかります)。

アップロードコードはかなり単純です:

@route('/upload', method='POST')
def upload_file():
  uploadfile = request.files.get('fileToUpload')
  if not uploadfile:
    abort(500, 'No file selected for upload')

  name,ext = os.path.splitext(uploadfile.filename)

  if ext not in ['.zip','.gz']:
    abort(500, 'File extension not allowed')

  try:
    uploadfile.save('./files')

    process_file(uploadfile.filename) #this function is not yet implemented

    return "uploaded file '%s' for processing" % uploadfile.filename
  except IOError as e:
    abort(409, "File already exists.")

uWSGI を使用してこのアプリケーションを展開する予定です (ただし、他のテクノロジが目的に適している場合は、確定していません。

このため、そのような目的での uWSGI の使用に関していくつか質問があります。

  1. ファイルのアップロードに数分かかる場合、uWSGI はブロックせずに他のクライアントをどのように処理できるでしょうか?
  2. ユーザーがアップロード後に応答を取得し、処理ステータスを照会できるように、uWSGI の組み込み機能を使用して処理をオフロードする方法はありますか?

助けてくれてありがとう。

4

1 に答える 1

8

ファイルのアップロードに数分かかる場合、uWSGI はブロックせずに他のクライアントをどのように処理できるでしょうか?

ブロックします。解決策は、リクエストをプリバッファするNGINX前にWeb サーバーのようなものを置くことです。そのため、ファイルのアップロードは、実際には が完了するまでNGINX ハンドラーにバインドされ、その後ハンドラーに渡されます。uWSGIPOSTuWSGI

ユーザーがアップロード後に応答を取得し、処理ステータスを照会できるように、uWSGI の組み込み機能を使用して処理をオフロードする方法はありますか?

Web ハンドラーから処理をオフロードするには、タスク キュー システムを作成する必要があります。これは一般的なベスト プラクティスです。周りを見回してくださいpython task queues。組み込み機能の場合、オフロードする必要があるタスクによって異なります。組み込みのuWSGI スプーラまたはuWSGI mulesを使用できます。これらは、典型的なタスク キュー (非常に有名なCeleryなど) の非常に優れた代替手段ですが、制限があります。シナリオで自分で試してみてください。

于 2013-08-15T15:43:32.200 に答える