Способы избежать ошибки переполнения стека в потоках в Python

Как родной Java-разработчик, я думаю, что попал в ситуацию, к которой я привык.

Я занимаюсь разработкой многопоточного приложения Python 2.7 с использованием PyDev и запускаю из Eclipse в Windows 7 64 бит. Он многопоточный, потому что он использует wxPython, и поэтому он использует основной поток графического интерфейса и тяжелые потоки (и у меня или у меня есть некоторые тяжелые подъемы) с одним потоком на обратный вызов.

Я достиг точки, где я получаю всплывающее окно 0xc00000fd ошибка в python27.dll с сообщением appcrash. Это происходит, когда функция в потоке возвращает значение. Если я уменьшу объем данных, с которыми работает обратный вызов, фрагмент кода будет работать нормально, так что я уверен, что в стеке слишком много всего, и нигде нет рекурсии.

Я мог позвонить stack_size в потоке перед созданием, чтобы увеличить пространство, доступное для меня, и, возможно, это могло бы работать некоторое время, если бы я должен был выяснить, сколько места будет его удовлетворять. Поток должен будет проделать больше, а не меньше работы, так что это похоже на ситуацию с бандой.

Я думал, что Python создал стек, используя кучу памяти, и поэтому это не должно быть проблемой в Python? Это один из моих многих сторонних API, который является настоящим преступником? Итак, без этой способности принимать решения по созданию памяти низкого уровня, которую я имел бы в C, как я могу получить часть этого из стека и в кучу памяти?

1 ответ

Python никогда не должен рухнуть, как сказал Гвидо:

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

Таким образом, сбой считается ошибкой самого Python, если это произойдет. Это крайне маловероятно, и, скорее всего, один из ваших модулей расширения делает что-то плохое и использует Python.

Мое предложение состоит в том, чтобы убрать вещи, пока вы не найдете точно, в чем проблема Если это происходит только с ядром Python, вам нужно отправить отчет об ошибке, в противном случае он должен обратиться к разработчикам того модуля расширения, который его вызывает.

Другие вопросы по тегам