我有一个使用 Aiohttp 的非常简单的文件服务器:
import os.path
from os import listdir
import asyncio
from aiohttp import web
import aiohttp_jinja2
import jinja2
@aiohttp_jinja2.template('template2.html')
@asyncio.coroutine
def get(request):
root = os.path.abspath(os.path.dirname(__file__))
files = [file_name for file_name in listdir(os.path.join(root,'files'))
if os.path.isfile(os.path.join(root, 'files', file_name))]
return {'files': files}
if __name__ == "__main__":
app = web.Application()
aiohttp_jinja2.setup(app, loader=jinja2.FileSystemLoader('/root/async'))
app.router.add_route('GET', '/', get)
app.router.add_static('/files/' , '/root/async/files')
loop = asyncio.get_event_loop()
f = loop.create_server(app.make_handler(), '0.0.0.0', 8080)
srv = loop.run_until_complete(f)
print(' serving on ', srv.sockets[0].getsockname())
try:
loop.run_forever()
except KeyboardInterrupt:
pass
当我使用攻城工具测试它时,例如,这样的命令:
siege -c 1000 -b -t 60 http://127.0.0.1:8080/files/kilobytes15.test
它引发了很多这样的异常:
socket.send() raised exception
并且传输的数据量非常小。我假设套接字在文件完全发送给用户之前关闭。对于一些建议,我将不胜感激。先感谢您!升级版:
模板2.html
<!DOCTYPE html>
<html>
<head><title>Aiohttp Test Server</title></head>
</body>
<h3>List of files:</h3>
<ul>
{% for item in files %}
<li><a href="/files/{{ item }}">{{ item }}</a></li>
{% endfor %}
</ul>
</body>
</html>
/root/async 目录包含 template2.html 和服务器脚本文件(开头提到的代码)。/root/async/files 目录包含一些 15b、15kb 和 15mb 大小的虚拟文件。
UPD:小文件不会出现异常。