Век живи, век учись, от нехватки памяти умрёшь
Наступил недавно на отличные питонячьи грабли. Хорошие такие, массивные, со специальными шипами на рукоятке.
Есть модуль, внутри него происходит fork — внутри потомка изолируется libmapi, у которой нещадно течёт память. Модуль используется внутри программы, которая перехватывает все exceptions (!). Знаю, что это неправильно, но она это делает в режиме отладки, для отладки и используется.
Загвоздка в том, что процесс-потомок выходил при помощи sys.exit. Если вы уже знаете в чём проблема, можете начинать хохотать. Я не знал и убил тестовую машину — кончилась память. Ваня Сагалаев тоже не знал.
sys.exit пораждает иключение и выходит с его помощью. Если где-то это исключение блокируется, то потомок, натурально, не может умереть. Решение простое — выходить надо по os._exit.
Хохотал. Я тоже использовал такой способ отладки — «хватай все эксепшены, а там разберёмся». На том и погорел.
Комментарий для gaius-julius.livejournal.com:
А я-то гадал — кто положил машину, возмущался :)
Вообще, «используется для отладки» -- это не оправдание для съедающего «except Exception:». Правильное поведение при этом -- слогить exception и *прокинуть его дальше* с помощью «raise».
Комментарий для softwaremaniacs.org/about/:
Да бог с этим всем уже :) Главное, что мы все получили экспов. Лично я это люблю. :) А то я так бы и не поглядел никогда что за зверь _exit и не знал бы, что выходить из чайлдов при помощи sys.exit — неправильно.