2

这个很难解释!

我正在编写一个通过 mod_python 运行的 python 应用程序。在每个请求中,返回的输出都不同,即使逻辑是“固定的”。

我有两个班,classAclassB。这样:

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

提前致谢

编辑 一些暗示问题可能出在其他地方的线索....对代码段的上述更改会导致每 250 次左右的点击中出现奇怪的输出 1。这很奇怪。

打印“In methodB”之前的输出越多,随后打印的错误就越多……平均而言,不是直接比率。它甚至在 Lynx 中也是如此。

我要回到绘图板上。

:(

作为回应

mod_python 和 Apache 似乎有婚姻问题。重新启动,对于一些请求来说一切都很好。然后一切都变得越来越梨形。发行时

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

这需要很长的时间。RAM 也被请求吞噬了。我对 Apache 的内部结构不是很熟悉,但感觉就像(感谢 Nadia)线程保持活动状态并随机对接请求。这简直是​​疯了。

按照 S.Lott 和 Nadia 的建议迁移到 mod_wsgi

再次感谢!!

4

2 回答 2

4

我以前见过 mod_python 的类似行为。通常是因为 apache 正在运行多个线程,其中一个正在运行旧版本的代码。当您刷新页面时,使用旧代码的线程可能正在为页面提供服务。我通常通过停止 apache 然后重新启动它来解决这个问题

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

自行重启并不总是有效。有时即使这样也行不通!这可能听起来很奇怪,但在极少数情况下,我最后的手段是raise Exception()在处理程序的第一行添加一条语句,刷新页面,重新启动 apache,然后再次刷新页面。每次都这样。必须有更好的解决方案。但这对我有用。mod_python 肯定会让人发疯!

我希望这可能会有所帮助。

于 2009-05-29T20:16:55.260 回答
1

我真的不知道,但构造函数不应该返回任何东西,所以删除return None. 即使他们可以返回东西,None如果函数本身不返回任何东西,也会自动返回。

而且我认为您需要self在 MethodB 中进行论证。

编辑:你能显示更多代码吗?这工作正常。

于 2009-05-29T19:41:07.797 回答