这个很难解释!
我正在编写一个通过 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")
class ClassB:
def methodB(self, req):
req.write("In methodB")
return None
这是我所拥有的大量剪裁版本。但我剪下来的东西并没有改变控制流程。只有一个地方调用MethodB()
。这是来自 classA
中的 __init__()
。
您会期望以下输出:
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
提前致谢
编辑 一些线索表明问题可能出在其他地方......以上对代码片段的更改会导致每 250 次左右的点击都会出现奇怪的输出 1。这很奇怪。
打印“In methodB”之前的输出越多,随后打印的错误就越多......平均而言,不是成正比。它甚至在 Lynx 中也能做到这一点。
我要回到绘图板。
:(
回应答案
mod_python 和 Apache 的婚姻似乎出现了问题。重新启动后,对于一些请求来说一切都很好。然后一切就变得越来越梨形。发行时
/etc/rc.d/init.d/httpd stop
这需要很长的时间。 RAM 也被请求耗尽。我不太熟悉 Apache 的内部结构,但感觉(感谢 Nadia)线程保持事件状态并随机插入请求。这简直是疯了。
按照 S.Lott 和 Nadia 的建议转向 mod_wsgi
再次感谢!!
最佳答案
我之前在 mod_python 中见过类似的行为。通常这是因为 apache 正在运行多个线程,其中一个线程正在运行旧版本的代码。当您刷新页面时,具有旧代码的线程可能正在为该页面提供服务。我通常通过停止 apache 然后重新启动来解决这个问题
sudo /etc/init.d/apache stop
sudo /etc/init.d/apache restart
自行重启并不总是有效。有时即使这样也不起作用!这可能听起来很奇怪,但在那些没有任何效果的极少数情况下,我的最后手段是在处理程序的第一行添加一个 raise Exception() 语句,刷新页面,重新启动 apache,然后刷新再次页面。每次都有效。必须有更好的解决方案。但这对我有用。 mod_python 肯定能让人发疯!
我希望这会有所帮助。
关于python - 真的很奇怪(mod)_python问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/927759/