Блог Обо мне Храню Читаю Ем 99  

06.04.2009, Nº 2077



Век живи, век учись, от нехватки памяти умрёшь

Наступил недавно на отличные питонячьи грабли. Хорошие такие, массивные, со специальными шипами на рукоятке.

Есть модуль, внутри него происходит fork — внутри потомка изолируется libmapi, у которой нещадно течёт память. Модуль используется внутри программы, которая перехватывает все exceptions (!). Знаю, что это неправильно, но она это делает в режиме отладки, для отладки и используется.

Загвоздка в том, что процесс-потомок выходил при помощи sys.exit. Если вы уже знаете в чём проблема, можете начинать хохотать. Я не знал и убил тестовую машину — кончилась память. Ваня Сагалаев тоже не знал.

sys.exit пораждает иключение и выходит с его помощью. Если где-то это исключение блокируется, то потомок, натурально, не может умереть. Решение простое — выходить надо по os._exit.
06.04 19:25
06.04 19:25



06.04.2009, Nº 2077

#1 gaius-julius.livejournal.com 06.04.2009, 23:01

Хохотал. Я тоже использовал такой способ отладки - "хватай все эксепшены, а там разберёмся". На том и погорел.

#2 bolk @bolknote.ru06.04.2009, 23:14 ответил gaius-julius.livejournal.com

А я-то гадал — кто положил машину, возмущался :)

#3 isagalaev @softwaremaniacs.org/about/07.04.2009, 13:20

Вообще, "используется для отладки" -- это не оправдание для съедающего "except Exception:". Правильное поведение при этом -- слогить exception и *прокинуть его дальше* с помощью "raise".

#4 bolk @bolknote.ru07.04.2009, 13:47 ответил softwaremaniacs.org/about/

Да бог с этим всем уже :) Главное, что мы все получили экспов. Лично я это люблю. :) А то я так бы и не поглядел никогда что за зверь _exit и не знал бы, что выходить из чайлдов при помощи sys.exit — неправильно.
Ваше имя или адрес блога:

Текст комментария (для гиков: не HTML, а текст!)


Кому бы вы хотели ответить (или кликните на его аватару)


Евгений Степанищев (imbolk@gmail.com)
t=0.033