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

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

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

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

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

gaius-julius.livejournal.com (gaius-julius.livejournal.com)
6 апреля 2009, 22:01

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

bolk (bolknote.ru)
6 апреля 2009, 22:14, ответ предназначен gaius-julius.livejournal.com:

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

isagalaev (softwaremaniacs.org/about/)
7 апреля 2009, 12:20

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

bolk (bolknote.ru)
7 апреля 2009, 12:47, ответ предназначен isagalaev (softwaremaniacs.org/about/):

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

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