Девман для питонистов
458 subscribers
107 photos
1 video
99 links
Веб-разработка на Python. Канал от практиков.
Download Telegram
🤔 Давайте вместе разберемся, что не так с этим кодом?

import argparse
import os
import httpx
from dotenv import load_dotenv
import json

EARTH_RADIUS_KM = 6378

👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
💡Согласно рекомендациям PEP8, импорты стоит разделять на 3 группы. И записывать каждую в отдельных блоках:
— стандартные библиотеки,
— сторонние библиотеки,
— локальные модули.

Кроме того, внутри каждой группы рекомендуется располагать импорты в алфавитном порядке и разделять пустой строкой импорты целиком и отдельных элементов.

Правильное расположение импортов будет таким:

import argparse
import json
import os

import httpx

from dotenv import load_dotenv


#оформление_python
Асинхронность vs многопоточность в FastAPI: как не убить производительность

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

Представьте: ваш сервис отлично работает при нагрузке в 100 RPS, но когда приходит 1000 запросов в секунду — всё начинает сыпаться. Сервер захлёбывается, время ответа растёт, а клиенты получают ошибки 503 Service Unavailable. Вы добавляете больше CPU и памяти, но проблема не исчезает. В чём же дело?

Проблема синхронных функций в асинхронном подходе

from fastapi import FastAPI
import time # Синхронная библиотека!


app = FastAPI()


@app.get("/blocking-endpoint")
async def blocking_endpoint():
"""Этот endpoint заблокирует весь event loop на 5 секунд!"""
time.sleep(5) # Синхронная блокирующая операция
return {"message": "Запрос выполнен"}

— Когда вы вызываете time.sleep(5) внутри async def, весь асинхронный event loop приостанавливается. event loop — это механизм для управления асинхронными операциями. Он позволяет обрабатывать задачи, не блокируя основной поток выполнения программы.
— Даже если другие пользователи отправляют запросы в это время, они не будут обрабатываться, пока sleep не завершится.

Это сводит на нет все преимущества от написания сложной логики асинхронного кода

👉 Если вы разрабатываете программный продукт на FastAPI и плохо разбираетесь в асинхронщине — используйте встроенный механизм многопоточности.

👉Собрали список популярных синхронных библиотек.

Встроенная многопоточность

FastAPI по умолчанию заботится о производительности при использовании синхронных (блокирующих) операций. Вместо того чтобы тормозить весь сервер, он автоматически выносит такие задачи в фоновые потоки.

Если вы объявляете endpoint*, как обычную функцию (def):
— FastAPI Определяет, что функция синхронная.
— FastAPI запускает функцию в ThreadPoolExecutor — пуле потоков.
— Пока функция выполняется, основной поток (event loop) продолжает работать и обрабатывать другие запросы.

*Endpoint — это конечная точка в API, к которой можно обратиться для выполнения нужного действия или получения данных. Например, на сайте Девмана есть эндпойнт /modules.

from fastapi import FastAPI
import time


app = FastAPI()


@app.get("/sync-route") # ← Обычная синхронная функция!
def sync_endpoint():
time.sleep(5) # Блокирующая операция
return {"message": "Это выполнится в отдельном потоке!"}

❗️В Python потоки выполняются не одновременно, а с переключениями. Но для I/O-операций (ожидание БД, сетевых запросов) этого достаточно — пока один поток ждет ответа, другой может работать. Если таких запросов будет слишком много, пул потоков переполнится.

❗️ Важно помнить, что Fast API создает потоки автоматически только для синхронных endpoint-функций:
— Если синхронный код вызывается внутри зависимостей, фоновых задач, middleware, а также при обработке WebSocket автоматическое распределение по потокам не работает.
— Встроенная многопоточность не работает в async def endpoints при работе с синхронными библиотеками. Например, requests.get(), pandas.read_csv() или psycopg2 требуют ручного выноса в потоки при вызовах из асинхронных обработчиков.

👉 FastAPI применяет умную многопоточность для синхронного кода, но это не замена полноценной параллельной обработке. Для сложных сценариев нужны дополнительные инструменты: процессы и корутины.

👉 Если вы плохо понимаете механизмы asyncio, а ваш pet-проект не предполагает высокой нагрузки (более 20 запросов одновременно) — можно положиться на встроенный механизм распределения по потокам.

Это сильно упростит код и снимет ограничения на использование синхронных библиотек, а также позволит сосредоточиться на изучении механизмов FastAPI, вместо погружения в «глубокую нору» асинхронной разработки.
🌟 Код-ревью — это проверка кода, написанного разработчиком для решения задачи, перед вливанием в основную ветку проекта.

Почему это полезно?

👉 Прокачивает навыки — вы учитесь на реальных примерах, а не на своих ошибках.

👉 Ускоряет рост — без код-ревью можно годами оставаться на одном уровне.

👉 Заставляет анализировать свой опыт. Если вы сами делаете код-ревью и объясняете, почему предложенное вами решение будет лучше.


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

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

Важно, что менеджеров в IT, около IT и вообще, много. Сегодня мы говорим именно про менеджеров проектов, не про продуктовых, операционных, аккаунт, бренд или каких-то ещё. Если будет интересно, в следующих постах поговорим и о других.

Сегодня Артем Каменев, ПМ с опытом 5+ лет поделится с нами своим опытом. Начнём сразу с самого больного вопроса.

Почему программисты ненавидят PM-ов?
Чаще всего, потому что не знают или не понимают, для чего они нужны.

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

Что делает PM?
✏️Следит за соблюдением планов и договоренностей;
✏️Отчитывается перед руководством компании о расходах и сроках проекта;
✏️Демонстрирует прогресс для заказчиков, неважно внешние они или внутренние;
✏️Собирает обратную связь по проекту со всех заинтересованных.

Как он это делает?
✏️Ведёт задачи в таск-трекере и следит за тем, чтобы другие вели их правильно;
✏️Проводит регулярные и точечные встречи с командой и заказчиком;
✏️Отслеживает трудозатраты и расходы по проекту;
✏️Заполняет отчёты и ведёт статусные страницы в вики-подобном формате;
✏️Переписывается. Постоянно и без остановок.

Какие бывают подходы к управлению проектами?

Подходов и фреймворков для ведения проектов много. Однако, их можно разделить на 3 категории:

👉 Каскадный (waterfall) подход. В IT чаще всего встречается в небольших проектах (1-3 месяца) и при работе с гос. организациями.

Главная особенность такого подхода — всё запланировано заранее на весь срок жизни проекта: задачи, дедлайны, технологии, встречи, трудозатраты, бюджет, команда, требования заказчика и т.д.

Каскадный подход многие считают устаревшим и неработающим, потому что тяжело предсказать всё при разработке. Тем не менее, иногда это нужно или, всё таки, возможно. Например, при работе над устоявшимся продуктом, типовым проектом или с гос. организациями.

👉Гибкий (AGILE) подход — встречается повсеместно и постоянно, т.к. гибкость понятие очень широкое :)

В отличии от каскадного подхода, гибкий не требует всё знать заранее и быть уверенным в каждом дне. В зависимости от компании, команды, конкретного фреймворка может быть установлен общий дедлайн на проект, конкретные его блоки или задачи. Но не всегда.

Гибкий подход универсален и разнообразен, в неопытных или ленивых руках может привести к хаосу. Тем не менее, он лучше всего подходит в условиях, когда нет чёткого ТЗ или требования меняются слишком часто.

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

👉 Гибридный подход — берём лучшее из каскадного и гибкого подходов, смешиваем и наслаждаемся.

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

Именно этот формат работы лучше всего подходит аутсорс командам. Когда требование «сделайте красиво», но бюджет «100 тысяч и не копейкой больше».

Коротко описать гибридный подход можно словосочетанием — управляемый хаос. По факту именно из-за необходимости управлять хаосом и растёт количество менеджеров разного формата.

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

➡️ Какой у вас опыт работы с ПМ-ами? Кто был наихудший, а кто наилучший и почему? И присылайте ваши любимые мемы про проджектов в комменты!
Please open Telegram to view this post
VIEW IN TELEGRAM
А каким инструментом для управления зависимостями пользуетесь вы?
Anonymous Poll
56%
Pip
16%
UV
29%
Poetry
0%
Другое (напишу в комментариях)
Please open Telegram to view this post
VIEW IN TELEGRAM
💥Напоминаем, что у нас действует реферальная программа!

Ваш друг мечтает стать разработчиком, но не знает с чего начать? Помогите ему получить одну из самых востребованных профессий в IT и присоединиться к сообществу питонистов!

🔥Порекомендуйте другу наш курс и он получит скидку 5000 рублей на оплату обучения. Бонусом — подарим вам 5000 рублей, которые вы сможете использовать как угодно.

Рассказываем, что нужно сделать:

1️⃣ Зарегистрируйтесь или авторизуйтесь на сайте

2️⃣ Перейдите на страницу программы по ссылке и нажмите «Получить ссылку»

3️⃣ Введите свое имя в форме.

Оно будет отображаться на странице с приглашением для друга.

4️⃣ Скопируйте ссылку и отправьте другу

5️⃣ Попросите друга перейти по ссылке и оставить заявку в форме

Наш менеджер свяжется с другом и ответит на вопросы

6️⃣Получите вознаграждение после того, как друг будет зачислен на курс и пройдет три месяца обучения

7️⃣Напишите нам в Telegram, чтобы отправить заявку на вознаграждение

Остались вопросы? Напишите нам в Телеграм!
Собеседование — важный этап поиска работы мечты. К нему можно и нужно готовиться. Благодаря подготовке, у вас будут не только готовые ответы на типовые вопросы, но и меньше волнения!

Сегодня разберем один из вопросов, который часто задают работодатели на собеседованиях веб-разработчиков на Python!

Что происходит под капотом джойна? Какие есть алгоритмы соединения таблиц?

В реляционных базах данных, таких как SQL, операцию соединения (join) используют для объединения строк из двух или более таблиц, основываясь на связанных между
ними столбцах. Есть разные типы алгоритмов соединения, каждый из которых имеет свои преимуществ и подходит для разных сценариев.

Разберем основные типы:

📎Nested Loops Join (Циклическое соединение)

👉Как работает: Для каждой строки из первой таблицы алгоритм последовательно проходит через каждую строку второй таблицы, сравнивая их для поиска совпадений.

⚙️Когда использовать: Эффективен, когда одна из таблиц значительно меньше другой. Обычно применяют, когда нет индексов, которые можно использовать для
оптимизации запроса.

Недостатки: Может быть медленным, особенно если обе таблицы большие, так как требует многократного перебора строк.

📎Hash Join (Хеш-соединение)

👉 Как работает: Создает хеш-таблицу для меньшей таблицы, а затем сканирует более крупную таблицу, сравнивая хеш-значения для нахождения совпадений.

⚙️Когда использовать: Хорошо подходит для больших таблиц, особенно когда соединение не может быть оптимизировано с помощью индексов. Эффективен для соединений типа equi-join (способ объединения данных из двух таблиц по равенству значений в указанных столбцах).

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

📎 Merge Join (Слияние)

👉 Как работает: Сначала сортирует обе таблицы по столбцам соединения, а затем итеративно проходит через обе таблицы одновременно для поиска совпадений.

⚙️Когда использовать: Особенно эффективен, если обе таблицы уже отсортированы по соответствующим столбцам. Часто используется для соединений с диапазоном условий.

Недостатки: Может быть медленным, если таблицы не отсортированы, так как требует предварительной сортировки.

🌟 Выбор наиболее подходящего алгоритма соединения зависит от множества факторов:
— размера таблиц,
— наличия индексов,
— условий соединения,
— доступной системной памяти.

Современные системы управления базами данных (СУБД) часто автоматически выбирают оптимальный метод соединения на основе этих факторов.

👉Пишите вопросы с собеседований, которые хотели бы разобрать, в комментариях!

#вопросы_с_собесов
🤔 Давайте вместе разберемся, что не так с этим кодом?

capitals = ('Москва', 'Лондон', 'Париж')

for i in capitals:
...

👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
❗️Завтра 12 июня с 12-00 до 14-00 будет недоступен терминал командной строки. Плановые работы на серверах.
Вместо абстрактной буквы i удобнее работать с конкретным, именованным объектом. Название должно быть содержательным, должно соответствовать объекту, описывать его.

Использование абстрактных символов и букв в программировании — плохая практика и вот почему:

Снижается читаемость
Когда голова забита кодом, вы вскоре уже сами не вспомните, что значит i (особенно, если таких букв не одна). Придется тратить время на расшифровку. Другие разработчики, особенно джуны, будут дольше разбираться в вашем коде.

Затрудняется поиск нужной переменной
При поиске i вы получите десятки, а может и сотни ненужных результатов.

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

Переменную в нашем примере стоит назвать так:

capitals = ('Москва', 'Лондон', 'Париж')

for capital in capitals:
...