Веб-сервер торнадо использует асинхронный код, чтобы обойти ограничение Python Global Interpreter Lock. GIL, как известно в разговорной речи, позволяет выполнять только один поток выполнения в процессе интерпретатора Python. Tornado может отвечать на многие запросы одновременно благодаря использованию цикла обработки событий. Цикл событий может выполнять одну маленькую задачу за раз. Давайте возьмем ваш собственный обработчик сообщений, чтобы лучше это понять.
В этом обработчике, когда интерпретатор python достигает ключевого слова await, он приостанавливает выполнение функции и ставит ее в очередь для последующего цикла обработки событий. Затем он проверяет цикл обработки событий, чтобы ответить на другие события, которые могли там находиться в очереди, такие как ответ на новое соединение или обслуживание другого обработчика.
Когда вы блокируете асинхронную функцию, вы замораживаете весь цикл обработки событий, так как он не может приостановить вашу функцию и обслуживать что-либо еще. На самом деле это означает, что ваш веб-сервер не будет принимать или обслуживать какие-либо запросы, в то время как ваши асинхронные функциональные блоки. Он будет выглядеть так, как будто ваш веб-сервер завис и действительно застрял.
Чтобы сервер отвечал, вы должны найти способ выполнить запрос sqlalchemy асинхронным неблокирующим способом.