Соединения торнадо не закрываются во FreeBSD - PullRequest
3 голосов
/ 06 декабря 2011

У меня есть веб-сервер торнадо, что-то вроде:

app = tornado.web.Application(handlersList,log_function=printIt)
app.listen(port)
serverInstance = tornado.ioloop.IOLoop.instance()  
serverInstance.start()

обработчики сделаны с tornado.web.RequestHandler.Когда я запускаю сервер на FreeBSD, иногда загрузка страницы / ресурса занимает много времени, при попытке отладки я вижу, что при ожидании загрузки страницы Tornado еще не создал объект запроса и, глядя на результаты netstat, я вижумного соединений со статусом ESTABLISHED.

Итак, я думаю, что существует слишком много незакрытых соединений, и операционная система отклоняет новое соединение, исходящее из того же сеанса.

Может ли это иметь место?

Я ничего не делаю в get, функции post после записи. Должен ли я как-то отключить / закрыть соединение перед возвратом?

EDIT 1: get / post синхронны (нет @asynchronous)

РЕДАКТИРОВАТЬ 2: временно исправлено путем принудительной установки no_keep_alive

class BasicFeedHandler(tornado.web.RequestHandler):

    def finish(self, chunk=None):
        self.request.connection.no_keep_alive = True
        tornado.web.RequestHandler.finish(self, chunk) 

Я не уверен, должны ли соединения keep_alive оставаться открытыми так долго после закрытия клиентского соединения, в любом случае этот обходной путь работает.
Я нашел, как это сделать, посмотрев на HTTPConnection._finish_request, когда нет поддержки активности, эта строка self.stream.read_until(b("\r\n\r\n"), self._header_callback) работает.что такое \ r \ n \ r \ n в этом контексте?

1 Ответ

1 голос
/ 18 декабря 2013

Попробуйте это:

class Application(tornado.web.Application):
    def __init__(self):
        ...

http_server = tornado.httpserver.HTTPServer(Application(),no_keep_alive=True)
http_server.listen(port)
tornado.ioloop.IOLoop.instance().start()
...