Автор: Алексей Фирсов (мейнтейнер aiopg, SoftPro) · MoscowPython
⚠️ Выпуск записан в 2019 году. Детали реализации aiopg и экосистема async-драйверов для PostgreSQL с тех пор изменились (появились asyncpg, sqlalchemy async, psycopg3). Архитектурные решения и вопросы дизайна — актуальны.
Первый выпуск Moscow Python Podcast (переименован из Python Junior Podcast) открылся «хардкором и сеньорностью». Гость: Алексей Фирсов, старший разработчик SoftPro и мейнтейнер библиотеки aiopg. Разговор ведут сооснователь MoscowPython Валентин Домбровский, тимлид NVIDIA Злата Обуховская и Григорий Петров. 44 минуты про то, как устроен асинхронный доступ к PostgreSQL из Python — и зачем вообще нужна отдельная библиотека для этого.
Центральный вопрос выпуска формулируется прямо: так ли уж нужна целая библиотека для взаимодействия асинхронного кода с PostgreSQL (05:32)? Ответ разворачивается через архитектурные детали: aiopg работает поверх psycopg2, который работает поверх написанной на C библиотеки libpq — и при этом сам написан на Python, а не на C. Почему — отдельный разговор (12:36).
Кому смотреть: Python-разработчикам, которые используют или планируют использовать async с PostgreSQL и хотят понять что происходит «под капотом», а не просто вызывать await conn.execute().
Из этого можно взять в работу: проверить в своём async-коде — есть ли места, где coroutine вызывается без await. Python это разрешает, и это источник трудноуловимых багов. Вопрос поднимается в выпуске явно (35:14) как вопрос дизайна языка.
Таймкоды: как Алексея затянуло в асинхронность и зачем ему понадобилась aiopg (01:08), предстоящие изменения в библиотеке (04:30), нужна ли вообще отдельная библиотека (05:32), главный профит от aiopg (08:25), почему не написали на C (12:36), что в aiopg не нравится самому мейнтейнеру (17:01), правда ли Django проще переписать с нуля чем сделать асинхронным (19:55), когда возникает необходимость асинхронно ходить в БД (26:00), json на 30 Гбайт который подвесил Григория Петрова (30:52), почему асинхронная ORM лучше чем просто ORM и драйвер (32:06), возможность вызова coroutine без await (35:14).
Вопрос «правда ли Django проще переписать с нуля, чем сделать там асинхронность» (19:55) — 2019 год, и история ответила: Django получил async-поддержку, но постепенно и с ограничениями, именно из-за глубины синхронной архитектуры.