Вы можете сделать это, используя ваш IOLoop
метод add_callback
, например:
loop.add_callback(lambda: some_function(message))
Tornado выполнит обратный вызов в следующем проходе IOLoop, который может (мне нужно было бы разобраться в кишках Торнадо, чтобы узнать наверняка, или, в качестве альтернативы, проверить его), разрешить выполнение запроса до того кода исполняется.
Недостатком является то, что написанному вами долго выполняющемуся коду все равно потребуется время для выполнения, и это может привести к блокировке другого запроса. Это не идеально, если у вас много таких запросов одновременно.
Более надежное решение - запустить его в отдельном потоке или процессе. лучший способ с Python - использовать процесс из-за GIL (я настоятельно рекомендую прочитать об этом, если вы не знакомы с ним). Однако на однопроцессорной машине многопоточная реализация будет работать так же хорошо и может быть проще в реализации.
Если вы идете по многопоточному маршруту, вы можете создать хороший модуль «async executor» с мьютексом, потоком и очередью. Проверьте модуль multiprocessing
, если вы хотите пойти по пути использования отдельного процесса.