@sinbadxiii

Можно ли в tornado фоном запустить метод?

Добрый день.

Есть задача по get запросу отдавать данные из БД. Но если в базе данных нет нужного значения, то отдать ответ self.write'у, пользователь получит загруженную страницу, а в это время запустить в фоне парсер, который достанет нужные значения и запишет их в БД. И при повторном запросе ответом уже будут записанные данные.

Мне смотреть в сторону Асинхронных запросов? Типа:

from tornado.httpclient import AsyncHTTPClient

def asynchronous_fetch(url, callback):
    http_client = AsyncHTTPClient()
    def handle_response(response):
        callback(response.body)
    http_client.fetch(url, callback=handle_response)


Или все же, тут надо потоки подключать?
  • Вопрос задан
  • 516 просмотров
Пригласить эксперта
Ответы на вопрос 1
@akonovalov
Программист на компьютере
Если исходить из предположения, что такие случаи отсутствия данных не редкие, а парсинг с добавлением данных в базу занимает ощутимое время и пользователь может подождать, то я бы, наверное, сделал следующее.
1) Завёл бы персистентную очередь заданий, например с помощью Redis или воспользовался бы уже имеющейся базой.
2) С помощью механизма PeriodicCallback периодически проверял бы эту очередь и ...
3) Запускал бы парсинг через Subprocess или joblib

Можно всё это делать и внутри Tornado, добавляя задачи в IOLoop - но есть риск, что в какой-то момент сервер будет занят преимущественно парсингом, а не обработкой реквестов с фронтенда.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы