1

画像/ビデオストリームを処理するためにDjangoでWebサービスを作成していますが、ほとんどが外部プログラムで行われています. 例えば:

  1. クライアントのリクエスト/1.jpg?size=300x200
  2. 300x200django (または他の WSGI アプリ) でのpython コードの解析
  3. パラメータ300x200で、モジュールを使用してpython呼び出しconvert(Imagemagickの一部)subprocess
  4. convertローカル ディスクから 1.jpg を読み取り、それに応じてサイズを変換します
  5. 一時ファイルへの書き込み
  6. Django はHttpResponse()、一時ファイルのコンテンツ全体を本体としてビルドして読み取ります

ご覧のとおり、一時ファイルの読み取りと書き込みのプロセス全体は非効率的です。このような同様の外部プログラムを処理するための一般的な方法が必要convertです.cjpegffmepg

私はこの方法でそれを実装したい:

  1. python は子プロセスの stdoutfdを取得しますconvert
  2. 出力のためにWSGIソケットfdにチェーンします

私は宿題をしました.Googleは、この種のゼロコピーはシステムコールで実行できると言いますsplice(). ただし、Python では使用できません。では、この種のシナリオで Python のパフォーマンスを最大化するにはどうすればよいでしょうか?

  1. ctypes?を使用して splice() を呼び出します。
  2. memoryview() または buffer() をハックしますか?
  3. subprocess has stdoutwhich has readinto()、これを何とか利用できますか?
  4. WSGI アプリの fd 番号を取得するにはどうすればよいですか?

私はこれらの初心者です。どんな提案でも大歓迎です、ありがとう!

4

2 に答える 2

1

fdWSGI は実際にインターレーター応答として処理できることがわかりました

WSGI アプリの例:

def image_app(environ, start_response):
    start_response('200 OK', [('Content-Type', 'image/jpeg'), ('Connection', 'Close')])
    proc = subprocess.Popen([
        'convert',
        '1.jpg',
        '-thumbnail', '200x150',
        '-', //to stdout
    ], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    return proc.stdout

パイプを介して標準出力を http 応答としてラップします

于 2013-09-04T04:34:44.227 に答える