Действительно странная (мод) _python проблема - PullRequest
2 голосов
/ 29 мая 2009

это трудно объяснить!

Я пишу приложение на 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, как предложили С. Лотт и Надя

еще раз спасибо !!

Ответы [ 2 ]

4 голосов
/ 30 мая 2009

Я видел подобное поведение с mod_python раньше. Обычно это происходит из-за того, что Apache запускает несколько потоков, а один из них использует более старую версию кода. Когда вы обновляете страницу, скорее всего, поток с более старым кодом обслуживает страницу. Я обычно исправляю это, останавливая apache, а затем перезагружая его снова

sudo /etc/init.d/apache stop
sudo /etc/init.d/apache restart

Перезапуск сам по себе не всегда работает. Иногда даже это не работает! Это может показаться странным, но в крайних случаях, когда ничего не работает, я добавляю оператор raise Exception() в первую строку обработчика, обновляю страницу, перезапускаю apache и снова обновляю страницу. Это работает каждый раз. Там должно быть лучшее решение. Но это то, что работает для меня. mod_python может наверняка свести с ума!

Надеюсь, это поможет.

1 голос
/ 29 мая 2009

Я действительно не знаю, но конструкторы не должны ничего возвращать, поэтому удалите return None. Даже если они могли бы вернуть вещи, None автоматически возвращается, если функция сама ничего не возвращает.

И я думаю, вам нужен self аргумент в MethodB.

РЕДАКТИРОВАТЬ: Не могли бы вы показать больше кода? Это работает нормально.

...