это трудно объяснить!
Я пишу приложение на python для запуска через mod_python. При каждом запросе возвращаемый результат отличается, хотя логика «фиксирована».
У меня есть два класса, classA
и classB
. Такие что:
class ClassA:
def page(self, req):
req.write("In classA page")
objB = ClassB()
objB.methodB(req)
req.write("End of page")
class ClassB:
def methodB(self, req):
req.write("In methodB")
return None
Что является сильно оторванной версией того, что у меня есть. Но материал, который я отрубил, не меняет поток управления. Существует только одно место, где MethodB()
называется. Это от __init__()
в classA
.
Ожидается следующий вывод:
In classA __init__
In methodB
End of __init__
Однако, по-видимому, случайным образом либо получите вышеуказанный правильный вывод, либо:
In classA __init__
In methodB
End of __init__
In methodB
Трассировка стека показывает, что methodB
вызывается второй раз с __init__
. methodB
следует вызывать только один раз. Если он вызывается во второй раз, вы ожидаете, что другая логика в __init__
будет выполнена дважды. Но ничего до или после methodB
не выполняется и рекурсии нет.
Я бы обычно не прибегал к использованию SO для отладки, но я какое-то время ломал голову над этим.
Версия: 2.5.2 r252: 60911
заранее спасибо
Редактировать
Некоторые подсказки, что проблема может быть в другом месте ... Вышеуказанные изменения в фрагменте приводят к странным выводам 1 из каждых 250 или около того попаданий. Что странно.
Чем больше выводится до печати «In methodB», тем больше она печатается впоследствии некорректно… в среднем, не в прямом соотношении. Это даже делает это в Lynx.
Я возвращаюсь к чертежной доске.
(
В ответ на ответ
Кажется, у mod_python и Apache проблемы в браке. Перезапуск и все хорошо для нескольких запросов. Тогда все становится все более грушевидным. При выдаче
/etc/rc.d/init.d/httpd stop
Это занимает странно много времени. Также ОЗУ съедается запросами. Я не очень хорошо знаком с внутренними компонентами Apache, но чувствует, что похоже (благодаря Nadia), что потоки остаются живыми и случайно добавляются в при запросах. Что просто помешано.
Переход к mod_wsgi, как предложили С. Лотт и Надя
еще раз спасибо !!