Как в обработчике запроса ответить клиенту и продолжить выполнение кода?

Небольшой сервер на торнадо, пример обработчика запроса:
class MessageHandler(tornado.web.RequestHandler):

    @gen.coroutine
    def post(self):
        if self.request.body == 'aaa':
            self.write("Запрос получен")
            self.finish()
            MyFunc() # Функция которая может выполняться длительное время
        else:
            self.write("Неверный запрос")

При выполнении условия я отвечаю клиенту что все хорошо, и чтобы клиент не ждал завершения обработки запроса (которое может затянуться функцией MyFunc()) я выполняю self.finish() - правильно ли я поступаю в этом случае?
Второй вопрос по поводу функции MyFunc() - в ней будут выполнятся запросы к другим сервисам с сохранением информации на HDD, т.е. она блокирующая. Я понимаю что сервер не будет обрабатывать следующие запросы пока она не завершится, поэтому есть желание вынести ее в отдельный поток, как рассказано в этой статье https://habrahabr.ru/post/231201/ - верная ли это мысль?
  • Вопрос задан
  • 419 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Tirael78
1 Отвечать клиенту - "все хорошо" до фактического выполнения запроса - в принципе не правильно. А если что то пойдет не так? а вы уже сообщили клиенту что все хорошо.

2 в отдельный поток или отдельный процесс? правильный ответ зависит от типа выполняемых операций, если у вас там сложные расчеты то поток вам не подойдет, он полезен при операциях ввода -вывода. Учтите, что реализация параллельности в windows и unix будет иметь отличия.

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

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы