У меня есть веб-сервер торнадо, что-то вроде:
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 в этом контексте?