非常奇怪(mod)\u python问题
这个很难解释 我正在编写一个通过mod_python运行的python应用程序。在每个请求中,返回的输出都不同,即使逻辑是“固定的” 我有两门课,非常奇怪(mod)\u python问题,python,debugging,mod-python,Python,Debugging,Mod Python,这个很难解释 我正在编写一个通过mod_python运行的python应用程序。在每个请求中,返回的输出都不同,即使逻辑是“固定的” 我有两门课,classA和classB。以便: class ClassA: def page(self, req): req.write("In classA page") objB = ClassB() objB.methodB(req) req.write("End of page")
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()
。这是来自classA
中的\uuuuu init\uuuuu()
您将期望以下输出:
In classA __init__
In methodB
End of __init__
但是,似乎是随机获得上述正确输出或:
In classA __init__
In methodB
End of __init__
In methodB
stacktrace显示方法B
正在从\uuuu init\uuuu
第二次调用<代码>方法B只应调用一次。如果第二次调用它,您会期望\uuuu init\uuuu
中的其他逻辑也执行两次。但是在methodB
之前或之后没有执行任何操作,也没有递归
我通常不会在调试时使用SO,但我对此挠头已有一段时间了
版本:2.5.2 r252:60911
提前感谢
编辑
一些线索表明问题可能在别处。。。。对代码段的上述更改会导致每250次左右的命中中有1次奇怪的输出。这很奇怪
“在方法B中”打印前的输出越多,随后错误打印的越多。。。平均而言,不是成正比的。它甚至在山猫身上也能做到
我要回到绘图板上
:(
回答
看起来mod_python和Apache有婚姻问题。重启后,一些请求就可以了。然后一切都变得越来越像梨形了。当
/etc/rc.d/init.d/httpd stop
这需要花费相当长的时间。RAM也被请求吞噬了。我对Apache的内部结构不太熟悉,但感觉(多亏了Nadia)线程仍然活着,在请求时随机插入。这简直是疯了
按照S.洛特和纳迪亚的建议,转到摩登wsgi
再次感谢!!我真的不知道,但是构造函数不应该返回任何内容,所以请删除
返回None
。即使他们可以返回内容,如果函数本身不返回任何内容,也会自动返回None
我认为在MethodB中需要一个self
参数
编辑:可以显示更多代码吗?这很好。我以前见过mod_python的类似行为。通常是因为apache正在运行多个线程,其中一个线程正在运行较旧版本的代码。刷新页面时,很可能是使用较旧代码的线程正在为页面提供服务。我通常通过停止更新来修复此问题然后重新启动它
sudo /etc/init.d/apache stop
sudo /etc/init.d/apache restart
独立重启并不总是有效的。有时甚至不起作用!这听起来可能有点奇怪,但在少数情况下,我最后的办法是添加一个raiseexception()
处理程序第一行的语句,刷新页面,重新启动apache,然后再次刷新页面。每次都是这样。一定有更好的解决方案。但这对我来说是可行的。mod_python肯定会让人发疯
我希望这会有所帮助。你打算省略“自我”吗在MethodB上?妈的,剪得太多了,我编辑不好。请用大写字母表示类名,小写字母表示方法名。请发布一段代码,说明问题所在。您发布的内容按预期工作。当它工作时帮不了什么忙。@S.Lott-我同意它应该工作。除了用'req.write()替换'print'之外“还有一堆不相关的列表分配。差不多就是这样。@艾登:我不否认你有问题。这个片段实际上是有效的。因此,你必须制作一个片段,它实际上无法为我们提供任何有用的建议。是的,这些错误与我的来源不一致,所以我编辑了这个问题,它仍然有效。它将是其中之一。”那些无聊的时刻。+1分用于阅读。我知道这可能是徒劳的,因为这是一个非常奇怪的演示。:)谢谢!这似乎是可行的。重新启动后,错误率似乎从低增加到高。重启后一切正常。。。然后是一个“方法B”,然后是3,然后是2,然后是5,然后又是1。@Aiden,相信我,我见过很多奇怪的案例。但我希望我疯狂的解决方案能对你有用。我根本不建议任何人使用mod_python@娜迪亚-谢谢:)很晚了。。。我想我明天会头脑清醒地回到这件事上来。将安装mod_wsgi并试一试。害怕PHP而不看选项:)@Nadia谢谢:)我从没想过会得到答案@我开始认为,当你很久以前提到wsgi时,我应该抛弃mod_python。但是,python和所有这些都是新的