После преобразования моего веб-сайта Google Apps Engine с Python 2.7 на Python 3.11 веб-сайт зависает примерно раз в час. Сообщение об ошибке заключается в том, что локальная переменная не определена. Эта ошибка не повторяется. Когда я запускаю тот же запрос, я не получаю ошибку.
Полное сообщение об ошибке из журнала:
UnboundLocalError: невозможно получить доступ к локальной переменной «Pelevation», где она находится. не связано со значением
В моей программе я не понимаю, как эта переменная может быть неопределенной. Я добавил проверку, в которой программа определяет переменную, чтобы убедиться, что она определена. Периодическая ошибка все еще происходит. Затем я добавил проверку на то, что переменная не определена, а затем вернул ей правильное значение. После установки переменной обратного значения в правильное значение следующая переменная, доступная в программе, становится неопределенной. У меня сложилось впечатление, что все переменные в программе стали неопределенными.
Эти симптомы соответствуют проблеме в управлении свободной памятью, к которой моя программа не имеет доступа. Я обновился до самой последней версии Flask и другого пакета поддержки, который использую. Это не изменило частоту возникновения этой периодически возникающей ошибки.
Я потратил около недели на поиск того, что могло вызвать эту проблему. Проблема присутствует на трех разных веб-сайтах с похожим кодом. Я застрял.
Пример кода будет слишком длинным. Однако описание кода может быть более понятным. Код Python 3.11 аналогичен коду Python 2.7, который никогда не давал сбоев.
Перед циклом ряд переменных загружается со строками из памяти NDB. Например, строка повышения уровня содержит 13 000 символов. Каждый символ указывает на то, что вид можно встретить на выбранной высоте. Первый признак может относиться к виду Aster alba, а последний признак может относиться к виду Zygmorf Zambia. Если пользователь выберет высоту 500 футов, строка около 500 футов будет загружена из NDB в строку высоты. Вторая строка может указывать местоположение. Если пользователь выбрал Нью-Йорк, строка для этого региона будет загружена из NDB в строку местоположения. Таким образом, программа устанавливает строки для многих атрибутов.
После того, как эти строки были загружены из NDB в различные переменные, вводится цикл. Цикл начинается с проверки первого символа в каждой строке атрибута и, если все символы «истинны», этот вид соответствует требованиям и добавляется в список видов, отвечающих всем критериям выбора. Следующая итерация цикла проверяет следующий символ во всех строках. После 13 000 итераций цикла все виды, соответствующие критериям отбора, были найдены и добавлены в список.
В цикле происходит сбой. Обычно это строка повышения, которая больше не содержит значения. Однако это может быть одна из других строк.
Чтобы разобраться в этой проблеме, я добавил код прямо перед началом цикла, проверяющего длину каждой строки. Это показывает, что при входе в цикл все строки имеют значение. Примерно через час работы этой версии веб-сайта произошел сбой, и строка повышения прав не имела значения. Я добавил код, чтобы, если строка повышения не имела значения, правильное значение снова считывалось из памяти NDB, позволяя программе продолжить работу. После внесения этого изменения программа продолжала аварийно завершать работу со строкой сразу после строки повышения, не содержащей значения.
Обратите внимание, что по мере цикла программы она добавляет в список виды, соответствующие критериям. Этот список может достигать 13 000 видов, если все виды соответствуют критериям. По мере того, как список становится длиннее, бесплатное программное обеспечение управления памятью может решить выполнить сбор мусора из свободной памяти. Если свободная память содержит ошибку, процесс сборки мусора может повредить содержимое переменных программы, что может привести к сбою «переменная, не связанная со значением». Час работы обычно составляет около 300 запросов. Многие из этих запросов были введены людьми. Некоторые запросы могут исходить от роботов, работающих в поисковых системах. Я также вижу запросы от вредоносных программ, которые генерируют вроде бы разумные запросы, но с явной фигней. Подобные вещи происходили с версией Python 2.7, и я не нашел никакой связи между этими атаками и сбоями.
Программе Python не разрешено повреждать свободную память. Ошибка в Python или в одной из других связанных программ, таких как Flask, может повредить свободную память.
Мне трудно понять, как я могу столкнуться с такой проблемой, не вызывая при этом проблемы с большинством других веб-сайтов Google App Engine. Я также не могу найти способ устранения этой проблемы.
Подробнее здесь: https://stackoverflow.com/questions/783 ... bout-every
Google App Engine, на котором работает веб-сайт Python 3.11, периодически дает сбой примерно каждый час из-за ошибки нев ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение