Улучшение реализации текущего процесса сельдерея - PullRequest
0 голосов
/ 26 апреля 2019

Я недавно работал с сельдереем. Я не использовал его раньше, но хотел использовать для асинхронной обработки запросов к базе данных sql, чтобы одна точка данных не препятствовала загрузке веб-страницы. (Это хороший вариант использования?)

Я реализовал что-то вроде ниже, но это кажется излишним, и, возможно, есть лучший способ сделать это. Буду очень признателен за критику и предложения.

Пример кода:

@celery.task
def _get_player_name(player_tag):
    player = PlayerStatsCurrent.query.filter_by(player_tag=player_tag).first()
    return player.player_name

def get_player_name(player_tag):
    result = _get_player_name.delay(player_tag)
    while not result.ready():
        time.sleep(0.5)
    player_name = result.get()
    return player_name

В приведенном выше примере моя веб-страница вызывает get_player_name вместе с некоторыми другими функциями, которые выглядят аналогично, но требуют больших вычислительных затрат.

Код работает. И я получаю вывод, как и ожидалось. Я просто хочу сделать это более "питоническим", потому что сейчас это не кажется СУХИМЫМ, и я не очень хорош в сельдерее, чтобы знать, как это сделать. Заранее благодарю за помощь.

1 Ответ

1 голос
/ 26 апреля 2019

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

То, что вы показываете выше, скорее всего, займет несколько миллисекунд. С другой стороны, если у вас есть запрос, выполнение которого занимает 10 секунд, разумно подумать о том, должна ли это быть фоновая задача, и, конечно же, если она занимает минуты.

Еще одно замечание, которое я хотел бы отметить: пока вы запускаете _get_player_name в качестве задачи Celery, функция get_player_name блокирует ожидание ее завершения. Если ваш веб-обработчик вызывает последнюю функцию, процесс / поток веб-сервера все еще блокируется на время выполнения задачи.

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

...