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

Небольшой сервер на торнадо, пример обработчика запроса:
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, безусловно это не снимет с вас проблем по блокирующим операциям, но позволит решать вопросы асинхроннсти более элегантным способом.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 12:53
1000 руб./за проект
19 апр. 2024, в 12:41
8000 руб./за проект
19 апр. 2024, в 12:05
1500 руб./в час