172 похожих чатов

Всем доброй ночи. Нужна помощь с pyo3. Примерно следующий порядок

действий: есть сервис на питоне, он вызывает растовую зависимость и передаёт callback. В расте следующий код:
let pool = unsafe { py.new_pool() };
let py = pool.python();
py.allow_threads(|| {
self.inner.scan_artifacts(
path.to_string(),
timeout,
|msg: ScanCallbackMsg| match msg {
ScanCallbackMsg::Match(name, rule) => Python::with_gil(|py| {
let rule = rule::PyRule::new(py, rule).unwrap();
let _ = match_callback.call1(py, (name, rule));
}),
ScanCallbackMsg::Error(name, err) => Python::with_gil(|py| {
let (code, message): (u32, String) = PyEngineScanError(err).into();
let _ = error_callback.call1(py, (name, code, message));
})

match_callback и error_callback - это питонячьи объекты
И вижу по графикам, что течет память, запускал под valgrind - ничего не показал... Может быть кто-нибудь подскажет? Видел пару issue на гитхабе, с похожими проблемами, но там народ переписал код и не было такой матрёшки, как у меня

3 ответов

7 просмотров

Я бы сначала начал исследовать с какой стороны течет память, на стороне python или расширения. - на стороне python можно периодически дергать len(gc.get_objects()) и писать в лог, если заметен постоянный рост объектов, то получается утечка на стороне python. Можно дополнительно логировать количество объектов по типу collections.Counter(map(type, gc.get_objects())) - на стороне расширения, можно воспользоваться бисекцией, комментируем одну половину, если все еще течет, коментируем половину от оставшейся половины и т.д. пока не локализуем участок

Ivan-Krivosheev Автор вопроса
Andr T
Я бы сначала начал исследовать с какой стороны теч...

В расте отключил почти все, течет где-то в связке питона и раста и видимо я не правильно понимаю, как pyo3 работает с памятью

Ivan Krivosheev
В расте отключил почти все, течет где-то в связке ...

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

Похожие вопросы

Обсуждают сегодня

Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
55
кто-то пользуется компонентами rx ? как их лучше ставить, через OPM? (lazarus)
Iluha Companets
15
подскажите пожалуйста, как мне освободить результат записанный в переменную result? в чем проблема подскажите если МОЖЕТЕ?
Михаил Helper
28
есть тут кто-то , кто только начал изучать си? если проходите курс на степике или как-то сами изучаете, пишите, может, скооперируемся?..
Eule
25
Слушайте, ещё такая интересная задачка. Сделан аудит действий пользователей через триггеры в базе, соответственно каждый пользователь имеет свой логин и пароль в базе. Это пре...
Сергей Бычков
12
Скажите, тут нет проблемы? IMyInterface1 = interface function GetInterface2: IInterface2; ... function TMyInterface.GetInterface2: IInterface2; begin Result := TI...
Ruslan aka DUDE
18
вопрос по москвину - не понимаю вот такого вопроса похоже Сколько разных всегда завершающихся функций с типом a -> a -> b -> a -> a можно реализовать? Две функции одинаково...
Fedor
11
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
t.me/<username> и tg://user?id=<id> отваливаются по понятным причинам
Denis 🐍|👑 | darling! 🥰
7
Кстати, раз про скачивание файлов разговор зашел) Сделал бота для себя (транскрибирующего и суммаризирующего встречи) но не ожидал что за 2 месяца 10к пользователей набежит😅...
Andrey Obolenskiy
8
Карта сайта