Asyncio + Aiohttp socket.send() поднял исключение

У меня очень простой файловый сервер, использующий 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

И объем передаваемых данных очень маленький. Я предполагаю, что сокет закрывается до того, как файл будет полностью отправлен пользователю. Я был бы очень признателен за некоторые предложения. Заранее спасибо! UPD:

template2.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: исключение не возникает для небольших файлов.

0 ответов

Другие вопросы по тегам