Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Подсказка по написанию комментария

В комментариях можно применять следующую специальную разметку:

  • слово, обрамлённое в «звёздочки» выделяется *жирным*
  • ссылка становится ссылкой: http://bolknote.ru
  • ссылка в скобках также становится ссылкой, закрывающая скобка не захватывается: (http://bolknote.ru)
  • каждую строку цитаты следует начинать со знака «больше»:
    > это цитата
    > из двух строк
  • можно вставить картинку, залитую на один из сервисов: «Яндекс.Фотки», «Фликр» или «Пикплз». Для этого нужно вставить на страницу полный адрес вашей картинки на сервисе, он превратится в картинку:

    http://fotki.yandex.ru/users/bolknote/view/274311?page=3