真奇(mod)_python问题

时间:2009-05-29 19:38:24

标签: python debugging mod-python

这个很难解释!

我正在编写一个要通过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

堆栈跟踪显示methodB第二次调用__init__methodB只应调用一次。如果第二次调用它,你会期望__init__中的其他逻辑也会被执行两次。但是methodB执行之前或之后没有任何内容,也没有递归。

我通常不会使用SO来进行调试,但是我一直在摸不着头脑。

版本:2.5.2 r252:60911

提前致谢

修改 一些线索,问题可能在其他地方....上面的片段更改导致每250个左右的命中奇怪的输出1。这很奇怪。

打印之前输出的数量越多“在方法B中”,随后打印的次数就越多......平均而言,不是直接比率。它甚至可以在Lynx中完成。

我回到绘图板。

:(

回答

似乎mod_python和Apache有婚姻问题。重启,一些请求的事情很好。然后它变得越来越梨形。发出时

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

这需要很长的时间。 RAM也会因请求而被吃掉。我对Apache的内部结构并不熟悉,但它感觉感觉像(感谢Nadia)线程保持活跃并且在请求中随机插入。这是简单的疯狂。

转向mod_wsgi作为S.Lott和Nadia建议

再次感谢!!

2 个答案:

答案 0 :(得分:4)

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

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

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

我希望这可能有所帮助。

答案 1 :(得分:1)

我真的不知道,但构造函数不应返回任何内容,因此请删除return None。即使他们可以返回内容,如果函数本身没有返回任何内容,也会自动返回None

我认为你需要在MethodB中有一个self参数。

编辑:你能展示更多代码吗?这很好。