3

次のコードは、複数のファイルをブラウザからホストに順次アップロードします。プロセスを高速化するために、複数のストリームがサーバーに送信されるようにファイルを並行して処理するにはどうすればよいでしょうか? ファイルが同じホストに送信されている場合、これを追求する価値はありますか? ブラウザーは、同じホストへの複数のアップロード ストリームを許可しますか? もしそうなら、これはどのように機能しますか?

ファイルは Python クライアントではなくブラウザーから送信されるため、こののようにファイルを分割して並列に書き込むことはできないと思います。

#!/usr/bin/python
import cgi, os
import shutil
import cgitb; cgitb.enable()  # for troubleshooting

form = cgi.FieldStorage()

print """\
Content-Type: text/html\n
<html><body>
"""

if 'file' in form:
   filefield = form['file']
   if not isinstance(filefield, list):
      filefield = [filefield]

   for fileitem in filefield:
       if fileitem.filename:
          fn = os.path.basename(fileitem.filename)
          # save file
          with open('/var/www/site/files/' + fn, 'wb') as f:
              shutil.copyfileobj(fileitem.file, f)
          # line breaks are not occuring between interations
          print 'File "' + fn + '" was uploaded successfully<br/>'
          message = 'All files uploaded'
else:
   message = 'No file was uploaded'

print """
<p>%s</p>
</body></html>
""" % (message)
4

2 に答える 2

3

フォーム送信は、単一の TCP 接続を使用して要求を配信する単一の HTTP 要求を生成します。

複数のファイルを並行してアップロードするには、複数のリクエストを並行して行います。クライアントにフラッシュまたは Java アプレットが必要な場合があります。JavaScript (AJAX) が複数のフォームの同時送信を許可しているかどうかを確認します。

于 2012-10-12T19:55:04.950 に答える
-1

一般的なパフォーマンスの改善は興味深いテーマです。重要なのは、実際にボトルネックが何であるかを見つけるために測定することです。

ブラウザがアップロードするファイルをロードするか、ロード中に利用可能な帯域幅(またはその両方)がボトルネックになると思います。

ボトルネックがバッファからのファイルの保存 (または一時ファイルの最終的な場所への移動) である場合は、for ループをスレッドに変換すると役立つ場合があります。ただし、Web サーバーにこれらすべてのファイルを書き込むための I/O 容量があると仮定します。ただし、スレッド化は、書き込むファイルが十分にある場合にのみ役立ちます。それ以外の場合、スレッドを繰り返し生成する (またはキューをロードしてスレッドのセットを開始する) 作業は、いくつかの小さなファイルを処理するループよりも遅くなります。

おもしろいので、Python スレッドとワーク キューに関する記事を次に示します: http://www.ibm.com/developerworks/aix/library/au-threadingpython/

Python CGI とファイルのアップロード、および POST を介した複数のファイルのアップロードに関するリファレンス:

于 2012-10-12T19:16:19.240 に答える