en
Feedback
About Python [ru]

About Python [ru]

Open in Telegram

Пишем на Python, создаём нейросети и ИИ-агентов. Алгоритмы, задачи и вайбкодинг. Личный блог автора - @just_genych По вопросам рекламы или разработки: @g_abashkin

Show more
6 490
Subscribers
+724 hours
-27 days
-3430 days
Posts Archive
💀 Жиза: нейронка Claude решила, что ей срочно нужно бабло, и попыталась снять с юзера больше 16 лямов баксов. Anthropic позж
💀 Жиза: нейронка Claude решила, что ей срочно нужно бабло, и попыталась снять с юзера больше 16 лямов баксов. Anthropic позже развела руками — мол, да, косяк вылез. Банк, само собой, сразу настучал на парня: «Ах ты ж мошенник!». Хорошо хоть кредитную историю AI ещё не научили выносить себе 🤨 Источник 👉 About Python

МТС Линк. Всё для коммуникации в команде 💻Платформа для общения, работы и обучения онлайн с поддержкой ИИ Встречи, чаты и зв
МТС Линк. Всё для коммуникации в команде 💻Платформа для общения, работы и обучения онлайн с поддержкой ИИ Встречи, чаты и звонки в одном приложении ✅МТС Линк доступен в Google Play. Берите работу с собой и оставайтесь на связи с коллегами в любое время Зарегистрироваться #реклама 16+ mts-link.ru О рекламодателе

Сводка pythonz 05.07.2026 — 12.07.2026 А теперь давай пробежимся по тому, что творилось в последние дни на соседних ресурсах. Детали тут: pythonz.net 👉 About Python

андартный Lock с таймаутом будет дешевле и понятнее.

Проектирование кастомного RLock-совместимого диспетчера блокировок с поддержкой deadline и приоритетного наследования в асинхронных воркерах Стандартный asyncio.Lock не поддерживает дедлайны и приоритеты — в production это приводит к инверсии приоритетов и зависанию воркеров. Без наследования приоритетов низкоприоритетная задача может блокировать критичный поток, а без дедлайна блокировка навсегда замораживает воркер. Проблема и решение В high-throughput системе с асинхронными воркерами (например, Celery + asyncio) конкуренция за общий ресурс без управления приоритетами вызывает голодание. Решение — кастомный диспетчер поверх asyncio.Lock с очередью на heapq и механизмом приоритетного наследования: когда высокоприоритетный воркер ждёт блокировку, его приоритет временно передаётся текущему владельцу. Архитектура диспетчера Ключевые элементы: * Очередь_Request с priority и deadline, реализованная через heapq. Приоритет инвертируется (отрицание) для корректной сортировки. * Рекурсивный счётчик для RLock-совместимости — блокировка может быть захвачена тем же воркером повторно. * Future для пробуждения: каждый запрос ассоциирован с asyncio.Future, которая вызывается при освобождении. * При наследовании приоритет владельца повышается до максимального из ожидающих, при освобождении сбрасывается. Упрощённый код ядра
import asyncio, heapq
from dataclasses import dataclass, field

@dataclass(order=True)
class _LockRequest:
    deadline: float
    priority: int
    future: asyncio.Future = field(compare=False)

class PriorityRLock:
    def __init__(self):
        self._owner = None
        self._current_priority = 0
        self._queue = []
        self._recursion_level = 0
        self._cond = asyncio.Condition()

    async def acquire(self, priority=0, timeout=None):
        loop = asyncio.get_event_loop()
        deadline = loop.time() + timeout if timeout else float('inf')
        future = loop.create_future()
        heapq.heappush(self._queue, _LockRequest(deadline, -priority, future))
        async with self._cond:
            if self._owner and priority > self._current_priority:
                self._current_priority = priority  # наследование
            while True:
                if self._owner is None and self._queue[0].future == future:
                    self._owner = id(asyncio.current_task())
                    self._current_priority = priority
                    self._recursion_level += 1
                    return True
                try:
                    await asyncio.wait_for(future, timeout)
                except asyncio.TimeoutError:
                    self._queue.remove(future)
                    heapq.heapify(self._queue)
                    return False

    async def release(self):
        async with self._cond:
            self._recursion_level -= 1
            if self._recursion_level == 0:
                self._owner = None
                self._current_priority = 0
                if self._queue:
                    top = self._queue[0]
                    loop.call_soon(top.future.set_result, None)
Типичная ошибка и практический совет Ошибка: забыть про сортировку heap при удалении — use _LockRequest с compare=False для future, иначе сравнение объектов ломает кучу. Практический совет: в production замените asyncio.wait_for на кастомный таймер с асинхронным сном, чтобы избежать оверхеда исключений при частых таймаутах. Для простых кейсов (один пул, без жёстких дедлайнов) используйте Lock с timeout — не усложняйте. Когда это критично? * Очереди с приоритетами в Celery/arq для воркеров к общему ресурсу (БД, кэш). * Системы с жёсткими дедлайнами, где превышение времени блокировки порождает цепную реакцию. * High-throughput сценарии, где инверсия приоритетов проявляется только под нагрузкой. Минусы: сложность отладки и оверхед на сортировку Heap (O(log n)). Но в продакшене без этого ловятся странные гонки и зависания, не воспроизводимые локально. Вывод: Проектируйте диспетчер блокировок с приоритетным наследованием и дедлайнами только под реальную нагрузку, иначе ст

Одна и та же функция — и так по кругу Живёт себе функция, мелкая, строк на десять. Приводит суммы из платежей к человеческому виду: было "1 234,50 ₽" — стало 1234.5. Ничего выдающегося. Только вот писал я её раз пять уже. В парсере банковских выписок, в импортёре заказов, в бухгалтерском отчёте, в скрипте (который потом нафиг выкинул) и ещё где-то. И каждый раз — с небольшими отличиями. В одном месте забыл про неразрывный пробел. В другом евро вместо рубля проскочило. В одном нашёл баг с минусом у отрицательных сумм, починил — а в остальных четырёх копиях он спокойно дожил до сих пор. Это первая статья из цикла про splime — инструмент, который родился именно из этой проблемы: таскать код между проектами, не копируя его каждый раз. Почитать на Habr 👉 About Python

Освой многопоточность в Java: вебинар с от Otus! Хочешь писать быстрый Java код? Приходи на открытый урок: разберём основы мн
Освой многопоточность в Java: вебинар с от Otus! Хочешь писать быстрый Java код? Приходи на открытый урок: разберём основы многопоточности - узнаешь, как ускорить приложения! Узнать больше #реклама 16+ otus.ru О рекламодателе

Квантование дробит вызов инструментов совсем не так, как рисует BFCL: проверил на MCP-серверах Что реально происходит с вызовом инструментов после квантования? Замутил бенчмарк QuantMCP — тестил модели на жалких 4 ГБ VRAM, но не на синтетике, а на живых схемах MCP-серверов. Главная жиза: популярные бенчмарки типа BFCL систематически впаривают фигню — их оценки коррелируют с реальным падением качества с обратным знаком, аж -0.755. Источник 👉 About Python

Учиться — не значит опять бежать с работы и на пары. Онлайн-магистратура для IT от ИТМО и МИФИ в партнёрстве с Яндекс Практик
Учиться — не значит опять бежать с работы и на пары. Онлайн-магистратура для IT от ИТМО и МИФИ в партнёрстве с Яндекс Практикумом построена на асинхронном формате. Смотрите лекции в записи, когда удобно, а практику проходите на платформе 24/7. Утром работаете, вечером учитесь — 82% студентов делают именно так. И при этом вы получаете очный диплом государственного образца без ущерба для карьеры и дохода. Узнайте всё о поступлении в 2026 году, подготовке к экзаменам и формате обучения. Узнать больше #реклама 16+ practicum.yandex.ru О рекламодателе

Динамический мониторинг утечек памяти: gc.get_objects и tracemalloc Память нельзя мониторить только статикой. OOM Killer приходит неожиданно, когда забытый lru_cache или циклическая ссылка в asyncio жрут все ресурсы. Решение — фоновый поток, который раз в N секунд снимает срезы gc.get_objects и tracemalloc, сравнивает с порогами и шлет алерт. Как работает gc.get_objects возвращает все отслеживаемые GC объекты. Считаешь количество инстансов своих классов через Counter. tracemalloc дает раскладку по строкам кода — сразу видно, где аллоцируется больше всего. Сравниваешь снимки, ловишь аномальный рост. Пример production-сбора
import gc
import tracemalloc
from collections import Counter

_MEMORY_THRESHOLD = 50 * 1024 * 1024  # 50 MB
_OBJECT_THRESHOLD = 10000

def check_leaks():
    alerts = {}
    type_counts = Counter(type(o).__name__ for o in gc.get_objects())
    for type_name, count in type_counts.items():
        if count > _OBJECT_THRESHOLD:
            alerts[f"obj_{type_name}"] = count

    snapshot = tracemalloc.take_snapshot()
    top_stats = snapshot.statistics('lineno')
    total_size = sum(stat.size for stat in top_stats[:10])
    if total_size > _MEMORY_THRESHOLD:
        alerts["memory_total"] = total_size
    return alerts
Подводные камни - gc.get_objects замораживает GIL. При миллионе объектов пауза ощутима — решай, готов ли к этому в пиковую нагрузку. - tracemalloc.start() дает оверхед ~20% на аллокации. Отключай в проде, когда не нужен, или включай дозировано. - tracemalloc не видит объекты, созданные до старта. Запускай сразу после инициализации приложения. - C-расширения вроде numpy не поддаются мониторингу — учитывай при анализе. Практический совет Ставь пороги на 70% от лимита контейнера. Экспортируй метрики в Prometheus через gc.get_count() и tracemalloc.get_traced_memory(). Для глубокой копки используй objgraph на визуализацию ссылок, pympler или memray. Если сработал алерт, бери py-spy или scalene — ищи конкретную причину. Вывод: Динамический мониторинг с gc.get_objects и tracemalloc — первый эшелон защиты от утечек, который позволяет поймать аномалию до падения прода.

Выпуск #743: Stacks & Queues, Django F-Expressions, MCP Clients и другое В свежем номере Trey Hunner объясняет, как заюзать о
Выпуск #743: Stacks & Queues, Django F-Expressions, MCP Clients и другое В свежем номере Trey Hunner объясняет, как заюзать обычный список Python для стека (LIFO) и deque из collections для очереди (FIFO). Tim Schilling копает Django F-Expression — штука для запросов через ORM, которая реально упрощает жизнь. Безопасность и инструменты Endor Labs зарелизил AURI — AI-агент, который через MCP выцепляет уязвимости, секреты и вредоносные зависимости прямо в редакторе. Ещё выкатился курс от Real Python по созданию Python MCP-клиента — для тестов MCP-серверов. Важные новости PEP 797 (Shared Object Proxies) отклонили. Django подвезла патчи безопасности 6.0.7 и 5.2.16. PEP 814 (frozendict) приняли — неизменяемые словари вкатят в Python 3.15. Там же появится режим профилирования интерпретатора с ультранизкими накладными расходами для анализа JIT. 👉 About Python

Talk Python to Me: #554 – Верить ли AI в медицине и вопросах долголетия Свежий эпизод подкаста уже висит в аудио. Жми сюда: Talk Python to Me: #554: Trustworthy AI in Healthcare and Longevity 👉 About Python

Кажется, digital снова меняется быстрее, чем мы успеваем это осознать. На днях Amazon Ads встроил кнопку «Добавить в корзину»
Кажется, digital снова меняется быстрее, чем мы успеваем это осознать. На днях Amazon Ads встроил кнопку «Добавить в корзину» прямо в пульт от телевизора. Теперь купить товар можно буквально во время просмотра фильма или сериала — без поиска сайта и переходов. Похоже, борьба за внимание закончилась. Началась борьба за одну кнопку. Такие изменения лучше всего показывают, куда движется рынок. И если работаешь в digital или IT, важно замечать не только громкие новости, но и понимать, какие возможности они открывают. Поэтому мы собрали подборку людей, которые не просто следят за новостями, а первыми разбирают, что действительно изменит рынок. Здесь можно почитать подборки, обзоры, реальные кейсы и идеи, которые помогают смотреть на digital и IT немного шире. Сохранить подборку себе 📨

Если хочешь развиваться в машинном обучении — решать реальные бизнес-задачи или уйти в исследования — в Центральном университ
Если хочешь развиваться в машинном обучении — решать реальные бизнес-задачи или уйти в исследования — в Центральном университете есть магистратура под оба сценария. И на нее можно получить грант до 75%. Места ограничены, дедлайн подачи заявок — 20 августа. «Машинное обучение» — это направление с несколькими форматами и треками. В офлайн-формате (пары по вечерам и в выходные в центре Москвы) можно выбрать один из трех треков: ⚫️Индустриальный — сильная база в ML, современные инструменты, реальные задачи от партнеров ⚫️Научный (AIRI × ЦУ) — сложные модели, исследования, подготовка к аспирантуре и работе в передовых лабораториях ⚫️ML в электронной коммерции × Lamoda — работа с реальными данными Lamoda, применение ML для бизнес-задач и возможность попасть на стажировку в компанию Для тех, кто хочет учиться из любой точки мира, есть онлайн-формат: основной трек и продвинутый — для специалистов с опытом в ML. Это полноценная альтернатива офлайну с теми же преподавателями и курсами. Магистратура в Центральном университете — это 2 года обучения, которое можно совмещать с работой, и диплом государственного образца. Карьерная поддержка начинается еще во время учебы: консультации, тренировочные собеседования и помощь с трудоустройством. Студенты уже в процессе обучения выходят на новые позиции или повышаются в грейде в Яндексе, Авито, Т-Банке и других компаниях. Поступление проходит через грантовый конкурс — это одновременно способ попасть на программу и возможность выиграть финансовую поддержку на все время обучения: грант покрывает до 75% стоимости. В 2026 году доступно 550 грантов на все программы магистратуры. Подробнее о программах и условиях участия в конкурсе — по ссылкам ➡️Офлайн программа ➡️Онлайн программа

Больше выгоды с подпиской Kaspersky Premium Купите подписку Kaspersky Premium сейчас и получите скидку до 28%, гарантированны
Больше выгоды с подпиской Kaspersky Premium Купите подписку Kaspersky Premium сейчас и получите скидку до 28%, гарантированные призы от наших партнёров, а также шанс выиграть путешествие! Узнать больше #реклама 16+ kaspersky.ru О рекламодателе

Асинхронная сериализация через __getstate__ / __setstate__ и Protocol 5 для zero-copy передачи данных между воркерами Когда данные летят между воркерами через multiprocessing или распределенные очереди, каждый байт копирования бьет по памяти. Стандартный pickle копирует объекты целиком, но переопределение __getstate__ / __setstate__ с protocol 5 позволяет избежать лишних копий. Zero-copy через out-of-band буферы В protocol 5 (Python 3.8+) появляется zero-copy передача через out-of-band буферы. Данные не упаковываются в байтовый поток, а передаются отдельно через shared memory или IPC. __getstate__ возвращает только словарь метаданных, а __setstate__ восстанавливает объект из буфера. Пример с NumPy
import pickle
import numpy as np

class ZeroCopyArray:
    def __init__(self, data):
        self.data = data
    def __getstate__(self):
        return {'shape': self.data.shape, 'dtype': self.data.dtype}
    def __setstate__(self, state):
        self.shape, self.dtype, self.data = state['shape'], state['dtype'], None
При дампе с protocol=5 данные физически не копируются, а None в сериализованном виде — expected. Где это критично По умолчанию pickle копирует большие массивы при передаче через Redis, RabbitMQ или multiprocessing.Queue. Два процесса — два полных копирования. Protocol 5 позволяет не копировать, если оба процесса на одной машине. * data pipelines с NumPy/Pandas, где каждый гигабайт на счету * дублирование конфигов с тяжелыми данными — сериализуем только параметры * потоковый парсинг бинарных протоколов Типичная ошибка и предупреждение Ошибка: думать, что zero-copy работает везде. Protocol 5 не поддерживается старым Celery с kombu, а out-of-band буферы требуют ручной передачи — они не входят в байтовый поток. На разных машинах zero-copy превращается в обычную копию из-за отсутствия shared memory. Практический совет Всегда ставьте protocol=pickle.HIGHEST_PROTOCOL. Для критичных сценариев используйте 5-й протокол с правильными __getstate__ / __setstate__. Изучите PEP 574, документацию pickle.Pickler и код dask с cloudpickle — это реальные production-источники. Вывод: Protocol 5 с кастомными методами сериализации дает zero-copy передачу данных между воркерами на одной машине, экономя память и время, но требует контроля совместимости и ручной передачи буферов.

Дачная дача в Т-Банк Шопе Футболки с огурцами, тыквами, капустой и другие крутые штуки, да еще и с финансовыми пожеланиями. Н
Дачная дача в Т-Банк Шопе Футболки с огурцами, тыквами, капустой и другие крутые штуки, да еще и с финансовыми пожеланиями. Надо брать. Посмотреть каталог Финансовые услуги оказывает: АО "Тинькофф Банк". #реклама tbank.ru О рекламодателе

Ну, запилить генерацию картинок и видео прямо в свой продукт — это можно провернуть локально за один вечер. Но стоит только кому-то кроме тебя этим воспользоваться — и начинается полный ***. Автор на Хабре разжёвал пошаговый гайд, как сделать всё без заморочек с DevOps. Источник: Habr 👉 About Python

Гайд МТС Линк для усиления лидогенерации Как выполнить KPI по лидам с помощью вебинаров? Изучили опыт 7.5 млн онлайн-мероприя
Гайд МТС Линк для усиления лидогенерации Как выполнить KPI по лидам с помощью вебинаров? Изучили опыт 7.5 млн онлайн-мероприятий, которые проходят на платформе ежегодно, и спешим поделиться бесплатным гайдом ✅ Что внутри: - Составили пошаговую инструкцию по организации маркетингового вебинара; - Собрали рекомендации экспертов по обучению, выступлениям и маркетингу; - Делимся успешными кейсами компаний DSSL, Just AI, «Гален», «САРШТЕДТ» и «ЭГИС-РУС» ✅ Кому полезно: - Маркетологам — для выполнения KPI по лидам; - Владельцам сложных продуктов — чтобы знакомить с продуктом поэтапно; - Экспертам и блогерам — для монетизации личного бренда; - B2B-командам — для сокращения цикла сделки через обучение клиентов. ✨ Скачайте бесплатно по ссылке Скачать #реклама 16+ mts-link.ru О рекламодателе

Ну что, брат, попал я тут в историю. Надо было отсортировать строки в базе, да ещё и зашифрованные. Первая мысль, конечно, как у нормального человека — наверняка есть какой-нибудь стандартный крипто-лайфхак, все так делают. Ну, копнул поглубже... и понял, что облом. Никто тебе готовую таблетку не подсунул. Простого решения там не завезли. И главный сюрприз: искал я ответ совсем не в том месте, где надо было. Читать на Хабре 👉 About Python