Некоторое время назад я писал о том, как можно добавить асинхронность в django. Теперь прошлый пост имеет только исторический интерес, если не читали, то не читайте. Принципиально подход не изменился, но стало гораздо проще и понятнее - не могу не написать. И пример кода другой.
Я писал только о django orm, и камнем преткновения там является обращение к базе данных, но подход можно обобщить на любой код, содержащий операции ввода-вывода.
В общем, выясняется, что добавить асинхронность в django - по сути, не сложнее, чем портировать его в асинхронность - раз и навсегда. Вы примерно представляете, как бы это нужно было делать: берём асинхронный драйвер с API примерно похожим на драйверы django и заменяем в недрах кода вызовы вроде driver.execute_sql(sql, params)
на вызовы вроде await async_driver.execute_sql(sql, params)
. Конечно, мы сразу получим SyntaxError
потому что нельзя использовать await в обычной функции, и будем вынуждены добавить async и await во всём стеке вызовов.
Весь API django отлично применим к асинхронной версии, за небольшими адаптации. Например, ленивых атрибутов больше не будет, а обращение к такому атрибуту будет возможно, если вы заранее извлекли его из базы, например, с помощью prefetch_related или select_related (для обращения к атрибуту, который требует обращения к базе, нужен другой API).
В принципе, работа несложная и даже относительно небольшая. Так вот, моя точка зрения, что добавление асинхронности (не ломая старый, синхронный, API) - это так же просто - возможно, за небольшими накладками.