Pull to refresh

Comments 13

Интересное расследование.

Получается, простой командой можно положить любую Python-программу. А почему return Py_NONE; не инкрементирует количество ссылок?

В документации написано, что если вы возвращаете Py_none, то самостоятельно должны следить за ссылками либо использовать Py_RETURN_NONE.

Все это описано в оф. документации, к сожалению, я не работаю с модулями на С и не могу более детально прокомментировать.

Да, я сразу глянул документацию, перед тем как спросить.

Наверное самая легкосовершаемая ошибка при биндинге C-кода к Python

А почему пустой цикл приводил к уменьшению количества ссылок?

При каждой итерации цикла происходило чтение сообщения из топика с последующим декодированием, вот как раз при декодировании ссылки и утекали.

Спасибо большое, читается с удовольствием. Хабр, как известно, давно уже не торт, а нытье про токсичность с абузерами (что бы это ни значило), и вот такие исчезающие пироженки с вишенками - это прям ностальгия, как на десять лет назад вернуться. Реальная - без драм масштабов вселенной - проблема, грамотное изложение, настоящее решение, ничей хрупкий дивный внутренний мир не пострадал, никто не расплакался и не выгорел по дороге от кофе-машины до офисного пинг-понга - и все это в одном посте на хабре в 2022 году. Идеально.

Большое спасибо за статью. Я посмотрел на PR, и получается что он висел 5 лет! Сколько же крови эта библиотека выпила у людей, которые ей пользовались?

Статья - огонь!

Я только не совсем понял мораль басни. Что в описанном случае было нарушением принципа "явное лучше неявного" (с которым я, конечно же, согласен целиком и полностью)?

Неявным является выбор конкретной реализации. Было бы лучше, если при использовании мы могли бы выбрать конкретную библиотеку.
Например, если бы был метод setCodec() или useLZ4fCodec()

Ааа. Понял! По статье я решил, что тип кодека динамически определяется, потому что так надо. Но сейчас заглянул в исходник - и код там просто пробует импортировать разные библиотеки и для декодирования использует то, что нашлось в наличии. Согласен - очень неочевидно.

Py_RETURN_NONE очень интересно (нет действительно очень и спасибо за статью), но что там насчёт


Поэтому код был значительно переработан и был удален asyncio.gather, вместо этого были созданы фоновые задачи и очереди. Повторные тесты показали, что в такой конфигурации приложение стало падать еще чаще… Как выяснилось позже, производительность сильно выросла и поэтому приложение стало чаще падать.

Можно поподробнее? :)

Все достаточно просто. Изначально приложение получало N сообщений из топика, и на каждое сообщение создавалась корутина. После происходило ожидание, пока все корутины не отработают. Затем я переписал приложение на несколько бэкгранудных задач, которые постоянно висят и ждут получения сообщений из локальных очередей - asyncio.Queue. А консьюмер закидывает сообщений в очередь на обработку и происходит обмен сообщениями/результатами между корутинами через асинхронные очереди.
Как результат характер работы приложения стал ламинарным, а не пульсирующим. С другой стороны мы перестали ждать обработку самого долгого сообщений и можем выполнять обработку несколькими корутинами-воркерами.

Sign up to leave a comment.

Articles