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

表单提交产生一个 HTTP 请求,该请求自然使用单个 TCP 连接来传递请求。

要并行上传多个文件,请并行发出多个请求。您可能需要客户端上的 flash 或 java applet。检查 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 回答