Django: могу ли я сделать запросы к БД асинхронными?

#python #django

#python #django

Вопрос:

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

Итак, конечно, страница чертовски медленная, и теперь я думаю, как это исправить. Я думал о создании индексов, но у меня нет для этого места. Я уже оптимизировал свои запросы до минимума возможных потерь, но загрузка страницы по-прежнему занимает около 1: 30 минут.

Я изучаю асинхронную поддержку в Django, но версия Django, которую я использую, похоже, не поддерживает (2.1).

У кого-нибудь есть какой-нибудь совет, который мог бы мне в этом помочь?

Я не показывал свой код, потому что решил, что в этом нет необходимости, поскольку этот вопрос более абстрактный. Речь идет не о моей проблеме, а об оптимизации в целом.

Комментарии:

1. Каналы сельдерея / Django

2. Больше похоже на проблему масштабирования.

Ответ №1:

Лучшая идея — использовать Сельдерей.
Хотя это не рекомендуется, вы можете использовать пулы потоков python. Что-то вроде этого:

 queries = {
    '1': query_1, # These are your queries.
    '2': query_2,
    '3': query_3,
    '4': query_4,
}
# Since queries are lazy in Django, they have not been evaluated, yet.

# creating a threadpool
pool = ThreadPool(processes=int(len(queries) * 0.5))
threads = dict()
results = {}
for key in queries.keys():
    threads[key] = pool.apply_async(lambda f: f, args=(queries[key], ))

# wait for all threads to finish
for key, item in threads.items():
    results[key] = item.get()
  

Теперь ваши запросы оцениваются асинхронно.