画像/ビデオストリームを処理するためにDjangoでWebサービスを作成していますが、ほとんどが外部プログラムで行われています. 例えば:
- クライアントのリクエスト
/1.jpg?size=300x200
300x200
django (または他の WSGI アプリ) でのpython コードの解析- パラメータ300x200で、モジュールを使用してpython呼び出し
convert
(Imagemagickの一部)subprocess
convert
ローカル ディスクから 1.jpg を読み取り、それに応じてサイズを変換します- 一時ファイルへの書き込み
- Django は
HttpResponse()
、一時ファイルのコンテンツ全体を本体としてビルドして読み取ります
ご覧のとおり、一時ファイルの読み取りと書き込みのプロセス全体は非効率的です。このような同様の外部プログラムを処理するための一般的な方法が必要convert
です.cjpeg
ffmepg
私はこの方法でそれを実装したい:
- python は子プロセスの stdout
fd
を取得しますconvert
- 出力のためにWSGIソケットfdにチェーンします
私は宿題をしました.Googleは、この種のゼロコピーはシステムコールで実行できると言いますsplice()
. ただし、Python では使用できません。では、この種のシナリオで Python のパフォーマンスを最大化するにはどうすればよいでしょうか?
ctypes
?を使用して splice() を呼び出します。- memoryview() または buffer() をハックしますか?
- subprocess has
stdout
which hasreadinto()
、これを何とか利用できますか? - WSGI アプリの fd 番号を取得するにはどうすればよいですか?
私はこれらの初心者です。どんな提案でも大歓迎です、ありがとう!