Торнадо действительно не блокирует? - PullRequest
19 голосов
/ 03 сентября 2010

Tornado объявляет себя как «относительно простая, неблокирующая платформа веб-сервера» и была разработана для решения проблемы C10k. Однако, глядя на их оболочку базы данных, которая оборачивает MySQLdb, я наткнулся на следующий фрагмент кода:

def _execute(self, cursor, query, parameters):
    try:
        return cursor.execute(query, parameters)
    except OperationalError:
        logging.error("Error connecting to MySQL on %s", self.host)
        self.close()
        raise

Насколько я знаю, обращения к MySQLdb, который построен поверх libmysqlclient, блокируют.

Правильно ли я думаю, что длительный запрос сделает весь сервер Tornado без ответа до его завершения или в коде есть магия?

Ответы [ 4 ]

33 голосов
/ 25 января 2011

Торнадо неблокирует, если вы пишете неблокирующий код сверху, например.используя asyncmongo и @tornado.web.asynchronous декоратор.Tornado в качестве фреймворка предоставляет инструменты для этого.

Брет Тейлор, один из первоначальных авторов, пишет :

Мы экспериментировали с различными подходами асинхронной БД, ноостановился на синхронном в FriendFeed, потому что, как правило, если наши запросы БД задерживали наши запросы, наши бэкэнды не могли масштабироваться до нагрузки в любом случае.Вещи, которые были достаточно медленными, были абстрагированы для разделения внутренних служб, которые мы извлекали асинхронно через асинхронный HTTP-модуль.

Это правда, что Tornado не включает неблокирующий слой базы данных;на самом деле уровень базы данных вообще не является неотъемлемой частью структуры Tornado, в отличие, например, от ORM Джанго.Да, Tornado поставляется с блокирующей оболочкой MySQL, потому что это то, что использовал FriendFeed, но это скорее внешняя библиотека, чем функциональность ядра.Я уверен, что большинство людей используют что-то другое для доступа к базе данных.

15 голосов
/ 03 сентября 2010

Да, при отсутствии других мер сервер будет ожидать завершения запроса.Это не означает, что Tornado не является неблокирующим веб-сервером.

«Неблокирующий веб-сервер» не блокирует сетевой ввод-вывод (и может иметь некоторые условия для дискового ввода-вывода, если онделает статическую подачу файлов).Это не означает, что вы получаете мгновенное выполнение инструкций, нарушающих причинность, в вашем приложении.

Выполнение вызова базы данных требует времени, так же как чтение файлов, форматирование строк, обработка шаблонов и т. Д. Требует времени.Выполнение любого из этих действий в том же потоке, что и основной цикл событий сервера, предотвратит продолжение цикла до тех пор, пока вы не закончите.

1 голос
/ 18 июня 2018

Tornado неблокирует , но ограничивается только некоторыми операциями ввода-вывода, такими как чтение или запись в файл сокета.

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

Помните, что одно неблокирование означает, что дата отправки / получения сервера не будет блокироваться.Если вы не можете сделать свой код неблокирующим, тогда все ваше приложение каким-то образом блокируется.

0 голосов
/ 04 сентября 2010

Да;это не полностью неблокирующий веб-сервер.

Неблокирующий веб-сервер не блокирует, используя неблокирующие API для ввода-вывода файлов, доступа к базе данных и т. д., чтобы гарантировать, чтоодин запрос, который должен ждать, пока что-то завершится, не препятствует обработке других запросов.Это относится к всему , которое может блокировать сервер, включая доступ к базе данных.

Нет ничего более глупого, чем «нарушение причинности», если у вас есть неблокирующий доступ к базе данных;имеет смысл запускать неблокирующий запрос, связанный с одним запросом, и обрабатывать другие запросы, пока он еще выполняется.На практике это обычно означает создание нескольких соединений с бэкэндом базы данных.

Обратите внимание, что если вы пытаетесь выполнить десять тысяч одновременных запросов, будьте осторожны: большинство бэкэндов базы данных не справятся с этим.Если у вас есть несколько десятков запросов к базе данных для параллельного выполнения, вы, вероятно, захотите что-то вроде пула соединений, чтобы веб-сервер мог выполнять множество соединений с базой данных, не перегружая серверную часть.Это приведет к блокировке запросов, ожидающих в очереди получения доступа к базе данных, но выполнение этого способа означает, что он не блокирует весь сервер - только запросы, которым нужна база данных.

...