interlock: Circuit Breaker That Trips on Failure Rate and Latency
https://github.com/bagowix/interlock
https://github.com/bagowix/interlock
One Day Offer для Python-разработчиков!💚
15 августа открываем двери в команду Agent Execution Framework ⚡️
Коллеги создают платформу для GenAI‑агентов в банке — делают так, чтобы ИИ реально работал в серьёзных финпроцессах: с безопасностью, нагрузкой и пользой.
Чем предстоит заниматься:
✔️ развивать backend на Python
✔️ подключать LLM, инструменты, базы знаний и RAG
✔️ строить пайплайны оценки качества агентов
✔️ участвовать в архитектуре и ревью кода
Встречаемся 15 августа онлайн.
Регистрируйся по ссылке
15 августа открываем двери в команду Agent Execution Framework ⚡️
Коллеги создают платформу для GenAI‑агентов в банке — делают так, чтобы ИИ реально работал в серьёзных финпроцессах: с безопасностью, нагрузкой и пользой.
Чем предстоит заниматься:
✔️ развивать backend на Python
✔️ подключать LLM, инструменты, базы знаний и RAG
✔️ строить пайплайны оценки качества агентов
✔️ участвовать в архитектуре и ревью кода
Встречаемся 15 августа онлайн.
Регистрируйся по ссылке
Бесплатный учебник по математике — 850 страниц.
«The Rising Sea: Foundations of Algebraic Geometry» Рави Вакила.
Книга предлагает подробное введение в алгебраическую геометрию и множество упражнений, позволяющих учиться на практике.
Требуется минимум предварительных знаний: необходимые инструменты вводятся по ходу материала — от теории категорий и пучков до коммутативной и гомологической алгебры.
Подход построен на примерах и помогает развить математическую интуицию.
Самодостаточный учебник для студентов магистратуры и аспирантуры, а также важный справочник для исследователей.
Link: https://math.stanford.edu/~vakil/216blog/
«The Rising Sea: Foundations of Algebraic Geometry» Рави Вакила.
Книга предлагает подробное введение в алгебраическую геометрию и множество упражнений, позволяющих учиться на практике.
Требуется минимум предварительных знаний: необходимые инструменты вводятся по ходу материала — от теории категорий и пучков до коммутативной и гомологической алгебры.
Подход построен на примерах и помогает развить математическую интуицию.
Самодостаточный учебник для студентов магистратуры и аспирантуры, а также важный справочник для исследователей.
Link: https://math.stanford.edu/~vakil/216blog/
🔴 Завтра тестовое собеседование на Middle Python с разработчиком из Авито
Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
📂 Даня, старший разработчик в Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Даня будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дане
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
Уже завтра вечером в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Python-разработчика.
Как это будет:
📂 Даня, старший разработчик в Авито, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Даня будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Дане
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Python-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_py_bot
Реклама.
О рекламодателе.
🐍 Как правильно запускать внешние команды из Python
Для большинства задач не нужны
Что здесь происходит:
-
-
-
-
Ошибки лучше обрабатывать явно:
Передавайте команду списком аргументов.
Подробнее:
https://pythonmorsels.com/running-subprocesses-in-python/
Для большинства задач не нужны
os.system() или низкоуровневый Popen. Достаточно subprocess.run() - он запускает программу, передаёт аргументы, возвращает код завершения и позволяет получить вывод.
import subprocess
result = subprocess.run(
["git", "status", "--short"],
capture_output=True,
text=True,
check=True,
timeout=10,
)
print(result.stdout)
Что здесь происходит:
-
capture_output=True сохраняет stdout и stderr-
text=True возвращает строки вместо bytes-
check=True выбрасывает CalledProcessError, если команда завершилась с ошибкой-
timeout=10 не позволяет процессу зависнуть навсегдаОшибки лучше обрабатывать явно:
import subprocess
try:
result = subprocess.run(
["git", "status", "--short"],
capture_output=True,
text=True,
check=True,
timeout=10,
)
except subprocess.TimeoutExpired:
print("Команда выполнялась слишком долго")
except subprocess.CalledProcessError as error:
print(error.stderr)
else:
print(result.stdout)
Передавайте команду списком аргументов.
shell=True нужен редко и может создать уязвимость к внедрению команд, особенно если строка содержит пользовательские данные.subprocess.run() - простой и надёжный мост между Python и системными утилитами, Git, компиляторами, CLI-инструментами и другими программами.Подробнее:
https://pythonmorsels.com/running-subprocesses-in-python/
Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней!
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
8 августа в Коломенском пройдет ИТ-Пикник.
В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.
А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.
Зарегистрироваться и узнать подробности можно на сайте мероприятия.
В билет входит +1 — можно позвать близких и друзей.
До встречи в месте притяжения ИТ.
🐍 Free-threaded Python убрал GIL, но NumPy всё равно упирался во внутренние блокировки
Казалось бы, Python 3.13+ без GIL должен позволить нескольким потокам одновременно выполнять численные операции.
Но на практике параллельные
В NumPy 2.5 разработчики устранили несколько ключевых узких мест:
- таблицу диспетчеризации
- часть общих служебных объектов сделали «бессмертными», снизив конкуренцию при подсчёте ссылок;
- выделение памяти перевели на
Теперь независимые операции можно масштабировать обычными потоками:
Главное преимущество перед
Потоки работают в одном адресном пространстве, поэтому могут эффективнее использовать многоядерный CPU и общую память.
Но есть важная оговорка:
free-threaded не означает автоматически thread-safe.
Одновременное изменение одного
Безопаснее использовать:
- отдельный массив для каждого worker;
- общий массив только для чтения;
- явную синхронизацию при записи.
Удалить GIL оказалось недостаточно. Чтобы Python действительно масштабировался по ядрам, пришлось перепроектировать и внутренности NumPy.
Подробнее:
https://labs.quansight.org/blog/scaling-numpy-on-free-threaded-python
Казалось бы, Python 3.13+ без GIL должен позволить нескольким потокам одновременно выполнять численные операции.
Но на практике параллельные
ufunc начинали конкурировать за внутренние структуры NumPy, счётчики ссылок и выделение памяти.В NumPy 2.5 разработчики устранили несколько ключевых узких мест:
- таблицу диспетчеризации
ufunc заменили на lock-free concurrent hash map;- часть общих служебных объектов сделали «бессмертными», снизив конкуренцию при подсчёте ссылок;
- выделение памяти перевели на
PyMem_RawMalloc и PyMem_RawFree.Теперь независимые операции можно масштабировать обычными потоками:
from concurrent.futures import ThreadPoolExecutor
import numpy as np
arrays = [
np.random.rand(5_000_000)
for _ in range(8)
]
with ThreadPoolExecutor(max_workers=8) as pool:
results = list(pool.map(np.sin, arrays))
Главное преимущество перед
multiprocessing - массивы не нужно сериализовать и копировать между процессами.Потоки работают в одном адресном пространстве, поэтому могут эффективнее использовать многоядерный CPU и общую память.
Но есть важная оговорка:
free-threaded не означает автоматически thread-safe.
Одновременное изменение одного
ndarray из нескольких потоков всё ещё может привести к гонкам, повреждённым данным и падению интерпретатора.Безопаснее использовать:
- отдельный массив для каждого worker;
- общий массив только для чтения;
- явную синхронизацию при записи.
Удалить GIL оказалось недостаточно. Чтобы Python действительно масштабировался по ядрам, пришлось перепроектировать и внутренности NumPy.
Подробнее:
https://labs.quansight.org/blog/scaling-numpy-on-free-threaded-python