⚡️Давайте вместе разберемся, что не так с этой строчкой кода?
👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана. Например, Уточните название функции
Выбирайте вариант ответа в опросе 👇
def is_draft_deal(self, obj):
...
👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана. Например, Уточните название функции
Выбирайте вариант ответа в опросе 👇
💡 Функция подразумевает некое действие, динамику.
Стандартные методы Django частенько используют названия, похожие на флаги, но это не повод создавать свои собственные по тому же принципу. Например, если функция с названием
Лучшим вариантом будет назвать функции 👉
#нейминг_python
is
, has
, must
, should
и прочие подобные глаголы отлично подходят для наименования переменной-флага, в который можно сложить результат работы функции. А название самой функции следует начинать с ее основного действия.Стандартные методы Django частенько используют названия, похожие на флаги, но это не повод создавать свои собственные по тому же принципу. Например, если функция с названием
is_draft_deal
будет передана в качестве аргумента, не получится сразу понять, что это именно функция, а не переменная.Лучшим вариантом будет назвать функции 👉
def check_deal_is_draft(self, obj):
...
#нейминг_python
Девман для питонистов
🚀Запускаем большую майскую распродажу! Скидки на ВСЕ мини-курсы с 1 по 18 мая! Майские праздники — отличный повод начать что-то новое и прокачать скиллы! 🔥 «Основы Python» — разберитесь с базовыми конструкциями языка и попрактикуйтесь в отладке кода! 🔥…
✍️В экосистеме Python было несколько попыток создать фреймворки, которые могли бы конкурировать с FastAPI, особенно в области высокопроизводительных асинхронных приложений.
Не все из них смогли закрепиться на рынке или получить широкое признание. Вот список конкурентов FastAPI, которые перестали развиваться, или так и не получили популярности.
Не все из них смогли закрепиться на рынке или получить широкое признание. Вот список конкурентов FastAPI, которые перестали развиваться, или так и не получили популярности.
👍5🔥2❤1
Девман для питонистов
🚀Запускаем большую майскую распродажу! Скидки на ВСЕ мини-курсы с 1 по 18 мая! Майские праздники — отличный повод начать что-то новое и прокачать скиллы! 🔥 «Основы Python» — разберитесь с базовыми конструкциями языка и попрактикуйтесь в отладке кода! 🔥…
⚡️Осталось три дня! Напоминаем, что сейчас действуют скидки на ВСЕ мини-курсы Devman!
Успейте приобрести мини-курс со скидкой 25%!
⚡️Выбирайте мини-курсы здесь или задавайте вопросы нам в Telegram!
Успейте приобрести мини-курс со скидкой 25%!
⚡️Выбирайте мини-курсы здесь или задавайте вопросы нам в Telegram!
❤3
🤔 Давайте вместе разберемся, что не так с этим кодом?
👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
import argparse
import os
import httpx
from dotenv import load_dotenv
import json
EARTH_RADIUS_KM = 6378
👉 Чтобы понять, что можно исправить, загляните в типичные улучшения Девмана.
Что не так с этим кодом?
Anonymous Poll
7%
Нельзя использовать "from ... import ..."
1%
Нужно перечислить импортированные библиотеки через запятую
60%
Импорты не отсортированы
0%
Объявление константы должно быть перед импортами
5%
Некорректный регистр при объявлении константы
26%
Между импортами и константой должно быть 2 пустых строки
💡Согласно рекомендациям PEP8, импорты стоит разделять на 3 группы. И записывать каждую в отдельных блоках:
— стандартные библиотеки,
— сторонние библиотеки,
— локальные модули.
Кроме того, внутри каждой группы рекомендуется располагать импорты в алфавитном порядке и разделять пустой строкой импорты целиком и отдельных элементов.
✅Правильное расположение импортов будет таким:
#оформление_python
— стандартные библиотеки,
— сторонние библиотеки,
— локальные модули.
Кроме того, внутри каждой группы рекомендуется располагать импорты в алфавитном порядке и разделять пустой строкой импорты целиком и отдельных элементов.
✅Правильное расположение импортов будет таким:
import argparse
import json
import os
import httpx
from dotenv import load_dotenv
#оформление_python
Асинхронность vs многопоточность в FastAPI: как не убить производительность
Все, кто хоть немного слышал про FastAPI, вероятно, знают, что он асинхронный. Но в приложениях, написанных с помощью этого фреймворка, можно использовать и синхронные библиотеки. При этом неопытный разработчик может поломать асинхронность кода и таким образом лишиться его преимуществ для проекта.
Представьте: ваш сервис отлично работает при нагрузке в 100 RPS, но когда приходит 1000 запросов в секунду — всё начинает сыпаться. Сервер захлёбывается, время ответа растёт, а клиенты получают ошибки 503 Service Unavailable. Вы добавляете больше CPU и памяти, но проблема не исчезает. В чём же дело?
Проблема синхронных функций в асинхронном подходе
— Когда вы вызываете
— Даже если другие пользователи отправляют запросы в это время, они не будут обрабатываться, пока
❌ Это сводит на нет все преимущества от написания сложной логики асинхронного кода
👉 Если вы разрабатываете программный продукт на FastAPI и плохо разбираетесь в асинхронщине — используйте встроенный механизм многопоточности.
👉Собрали список популярных синхронных библиотек.
Встроенная многопоточность
FastAPI по умолчанию заботится о производительности при использовании синхронных (блокирующих) операций. Вместо того чтобы тормозить весь сервер, он автоматически выносит такие задачи в фоновые потоки.
Если вы объявляете endpoint*, как обычную функцию (def):
— FastAPI Определяет, что функция синхронная.
— FastAPI запускает функцию в ThreadPoolExecutor — пуле потоков.
— Пока функция выполняется, основной поток (event loop) продолжает работать и обрабатывать другие запросы.
*Endpoint — это конечная точка в API, к которой можно обратиться для выполнения нужного действия или получения данных. Например, на сайте Девмана есть эндпойнт
❗️В Python потоки выполняются не одновременно, а с переключениями. Но для I/O-операций (ожидание БД, сетевых запросов) этого достаточно — пока один поток ждет ответа, другой может работать. Если таких запросов будет слишком много, пул потоков переполнится.
❗️ Важно помнить, что Fast API создает потоки автоматически только для синхронных endpoint-функций:
— Если синхронный код вызывается внутри зависимостей, фоновых задач, middleware, а также при обработке WebSocket автоматическое распределение по потокам не работает.
— Встроенная многопоточность не работает в async def endpoints при работе с синхронными библиотеками. Например,
👉 FastAPI применяет умную многопоточность для синхронного кода, но это не замена полноценной параллельной обработке. Для сложных сценариев нужны дополнительные инструменты: процессы и корутины.
👉 Если вы плохо понимаете механизмы
Это сильно упростит код и снимет ограничения на использование синхронных библиотек, а также позволит сосредоточиться на изучении механизмов 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, вместо погружения в «глубокую нору» асинхронной разработки.
❤1