2009-05-29 2 views
2

этот трудно объяснить!Действительно странно (mod) _python problem

Я пишу приложение 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 

StackTrace показывает, что methodB вызывается во второй раз от __init__ , methodB следует вызывать только один раз. Если он будет вызван во второй раз, вы ожидаете, что другая логика в __init__ будет сделана дважды. Но ничего до или после methodB не выполняется, и нет рекурсии.

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

Версия: 2.5.2 R252: 60911

заранее спасибо

Редактировать Некоторые подсказки о том, что проблема может быть в другом месте .... Вышеуказанные изменения в результате сниппета в странный выход 1 каждые 250 или около того. Что странно.

Чем больше выходных данных перед печатью «В методе B», тем больше он печатается впоследствии неправильно ... в среднем, а не в прямом отношении. Это даже делает это в Lynx.

Я возвращаюсь к чертежной доске.

:(

В ответ на ответ

кажется mod_python и Apache возникают проблемы в браке. Перезагрузка и все в порядке в течение нескольких запросов. Тогда все идет более грушевидный. При выдаче

/etc/rc.d/init.d/httpd stop 

он принимает причудливо долгое количество времени. Кроме того, RAM становится съеден с запросами. Я не знаком с внутренним Apache, но чувствует как (спасибо Надя), что потоки остаются живыми и случайным образом прикладом в по запросам. Это простые бредеры.

Переезд в mod_wsgi as S.Lott и Nadia предложили

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

+0

Вы намеревались оставить «я» на MethodB? –

+0

Дерьмо, слишком много сна, плохое редактирование. –

+2

Пожалуйста, используйте верхний регистр для имен классов и строчные буквы для имен методов. И, пожалуйста, опубликуйте фрагмент, который показывает проблему. Материал, который вы опубликовали, работает так, как ожидалось. Не может помочь, когда это работает. –

ответ

4

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

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

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

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

+0

Это кажется выполнимым. Вероятность ошибки возрастает с низкого до высокого после перезапуска * царапины подбородка * –

+0

Все еще странно, что внутренний метод называется «из стека». –

+0

+1 Это то, о чем я думал. Убрал мой ответ, так как вы сказали это лучше и более подробно. – Doug

1

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

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

EDIT: Не могли бы вы показать больше кода? Это работает нормально.

+0

Да, эти ошибки не совпадают с моим источником, поэтому я редактировал вопрос, и он все еще стоит. Это будет один из тех Дох! моменты. –

+0

+1 Точка для чтения. Я знал, что это, вероятно, будет бесплодным, потому что это действительно странная презентация. :) Благодаря! –

Смежные вопросы